2011-10-21 29 views
5

Nhìn qua S4 wiki Hadley Wickham: https://github.com/hadley/devtools/wiki/S4constructors S4 và nguyên mẫu

setClass("Person", representation(name = "character", age = "numeric"), 
    prototype(name = NA_character_, age = NA_real_)) 
hadley <- new("Person", name = "Hadley") 

Làm sao chúng ta có thể thiết kế một constructor cho Person (như thế này)

Person<-function(name=NA,age=NA){ 
new("Person",name=name,age=age) 
} 

mà không làm điều này:

> Person() 
Error in validObject(.Object) : 
    invalid class "Person" object: 1: invalid object for slot "name" in class "Person": got class "logical", should be or extend class "character" 
invalid class "Person" object: 2: invalid object for slot "age" in class "Person": got class "logical", should be or extend class "numeric" 
+0

Cập nhật: setClass trả về một constructor mặc định: Person <- SetClass ("Người", ...) – ctbrown

Trả lời

4

Có vẻ như câu trả lời nằm ngay trong ví dụ của bạn:

Person<-function(name=NA_character_,age=NA_real_){ 
new("Person",name=name,age=age) 
} 

mang

> Person() 
An object of class "Person" 
Slot "name": 
[1] NA 

Slot "age": 
[1] NA 

> Person("Moi") 
An object of class "Person" 
Slot "name": 
[1] "Moi" 

Slot "age": 
[1] NA 

> Person("Moi", 42) 
An object of class "Person" 
Slot "name": 
[1] "Moi" 

Slot "age": 
[1] 42 

Tuy nhiên, đó là khá un-S4 và bản sao các giá trị mặc định đã được phân công trong định nghĩa lớp. Có thể bạn muốn làm

Person <- function(...) new("Person",...) 

và hy sinh khả năng gọi mà không có đối số được đặt tên?

3

Tôi muốn cung cấp cho người dùng cuối một số gợi ý về các loại đối số hơn đề xuất sử dụng ... bởi @themel. Đồng thời gửi mẫu thử và sử dụng length([email protected]) == 0 làm chỉ báo rằng trường không được khởi tạo, sử dụng lớp People thay vì Person, phản ánh cấu trúc vector của R và sử dụng ... trong hàm tạo để các lớp dẫn xuất cũng có thể sử dụng hàm tạo.

setClass("People", 
    representation=representation(
     firstNames="character", 
     ages="numeric"), 
    validity=function(object) { 
     if (length([email protected]) != length([email protected])) 
      "'firstNames' and 'ages' must have same length" 
     else TRUE 
    }) 

People = function(firstNames=character(), ages=numeric(), ...) 
    new("People", firstNames=firstNames, ages=ages, ...) 

People(c("Me", "Myself", "I"), ages=c(NA_real_, 42, 12)) 
Các vấn đề liên quan