2012-10-21 27 views
15

Có thể tạo lớp S4, trong đó một hoặc nhiều vị trí có thể có nhiều lớp không? Ví dụ. Giả sử bạn có một tình huống mà dữ liệu có thể là một vectơ hoặc một data.frame.Lớp S4: Nhiều loại cho mỗi khe

exampleClass <- setClass("exampleClass", 
    representation(raw=c("data.frame","numeric","character"), 
    anotherSlot=c("data.frame","numeric")) 

Hoặc, đây có phải là loại tình huống khi xác định lớp phụ/siêu lớp trở nên cần thiết không?

PS: Tìm kiếm hướng dẫn hữu ích về các lớp học S4 tạo ra kết quả hạn chế. Các liên kết đến một hướng dẫn tốt về tạo/sử dụng/tài liệu lớp S4 sẽ được đánh giá cao.

+6

Những thứ có khe là lớp S4. – Spacedman

+0

Không chỉ vậy, mọi thứ bạn trình bày đều liên quan đến cơ chế phương pháp S4. –

+0

Vâng, tệ của tôi. Sai số. –

Trả lời

22

R có 'công đoàn lớp', vì vậy

setOldClass("data.frame") 
setClassUnion("data.frameORvector", c("data.frame", "vector")) 

Lớp data.frameORvector là ảo, vì vậy không thể được khởi tạo nhưng có thể được sử dụng trong các khe khác (representation=), như là một lớp chứa (contains=), và cho công văn

A = setClass("A", 
     representation=representation(x="data.frameORvector")) 


> A(x=1:3) 
An object of class "A" 
Slot "x": 
[1] 1 2 3 

> A(x=data.frame(x=1:3, y=3:1)) 
An object of class "A" 
Slot "x": 
    x y 
1 1 3 
2 2 2 
3 3 1 

Phương pháp có thể khó thực hiện bởi vì tất cả những gì bạn biết là vị trí chứa một trong các loại cha mẹ của công đoàn.

setGeneric("hasa", function(object) standardGeneric("hasa")) 
setMethod("hasa", "data.frameORvector", function(object) typeof([email protected])) 

> hasa(A(x=1:5)) 
[1] "integer" 
> hasa(A(x=data.frame(y=1:5))) 
[1] "list" 

Tôi thực sự tìm thấy tài liệu trên ?Classes, ?Methods, ?setClass, và bạn bè giúp đỡ. Hadley Wickham có một số tutorial (ví dụ trên trang này không mạnh lắm, tức là Person, trong khi khái niệm sẽ viết People để khai thác điểm mạnh vector hóa của R) và có một phần trong Bioconductor course gần đây này. Tôi không nghĩ đến việc đi sâu vào chi tiết về công đoàn.

+6

Martin Morgan - Câu trả lời tuyệt vời của bạn cho rất nhiều câu hỏi lập trình R thực sự ở đây trên SO là một bổ sung tuyệt vời cho cộng đồng này. Chỉ muốn cung cấp cho bạn đạo cụ và cảm ơn cho điều đó. –

+0

Đồng ý và các câu trả lời trước đây về câu hỏi S4 đã được giải thích rất rõ. –

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