2012-12-12 20 views
6

R Version:Sử dụng S3 lớp ảo như khe của một lớp S4, đã nhận lỗi: có lớp "S4", nên hay mở rộng lớp "nls.lm"

R version 2.15.2 (2012-10-26) 
    Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

Tôi muốn làm một lớp S4 sử dụng các đối tượng đầu ra của hàm của nls.lm (gói: minpack.lm) như là một khe:

setOldClass("nls.lm") 

setClass (
    Class="TestClass", 
    representation=representation(
     lmOutput = "nls.lm", 
     anumeric = "numeric" 
    ) 
) 

Bây giờ, nếu tôi muốn gọi lớp này trong một "chức năng constructor" tôi có thể làm điều gì đó như này (đúng?):

myConstructor <- function() 
{ 
    return(new("TestClass")) 
} 

pippo <- myConstructor() 

pippo 
An object of class "TestClass" 
Slot "lmOutput": 
<S4 Type Object> 
attr(,".S3Class") 
[1] "nls.lm" 

Slot "anumeric": 
numeric(0) 

Và đối tượng "pippo" dường như được khởi tạo đúng cách.

Nếu tôi sử dụng mã này thay vào đó tôi đã nhận ra lỗi:

myConstructor2 <- function() 
{ 
    pippo <- new("TestClass", anumeric=1000) 
    return(pippo) 
} 

pippo <- myConstructor2() 
Error in validObject(.Object) : 
invalid class “TestClass” object: invalid object for slot "lmOutput" in class "TestClass": got class "S4", should be or extend class "nls.lm" 

Có vẻ rằng nếu tôi muốn init trong mới một số khe cắm, điều này tạo ra vấn đề với một khe cắm S3 Class?

Bất kỳ đầu mối nào về cách tránh sự cố này?

Cảm ơn

Trả lời

3

Trên thực tế, các nhà xây dựng không tham số trả về một đối tượng không hợp lệ, quá, nó chỉ không được kiểm tra

> validObject(new("TestClass")) 
Error in validObject(new("TestClass")) : 
    invalid class "TestClass" object: invalid object for slot "lmOutput" 
    in class "TestClass": got class "S4", should be or extend class "nls.lm" 

Giải pháp là để cung cấp một mẫu thích hợp, có thể

setClass (
    Class="TestClass", 
    representation=representation(
     lmOutput = "nls.lm", 
     anumeric = "numeric" 
    ), 
    prototype=prototype(
     lmOutput=structure(list(), class="nls.lm") 
    ) 
) 
+0

cảm ơn cho câu trả lời nhanh chóng. Chỉ cần triển khai trong mã "thực" của tôi. Đối tượng là hợp lệ ngay bây giờ! – tucano

Các vấn đề liên quan