2012-10-21 1 views
15

하나 이상의 슬롯이 여러 클래스로 구성 될 수있는 S4 클래스를 만들 수 있습니까? 예를 들어. 데이터가 벡터이거나 data.frame 일 수있는 상황이 있다고 가정 해 보겠습니다.S4 클래스 : 슬롯 당 여러 유형

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

또는 하위 클래스/수퍼 클래스를 정의해야하는 상황입니까?

추 신 : S4 강좌에서 유용한 자습서를 검색하면 제한된 결과가 생성됩니다. S4 클래스 생성/사용법/문서화에 대한 좋은 튜토리얼에 대한 링크는 크게 감사하겠습니다.

+6

슬롯이있는 것은 S4 클래스입니다. – Spacedman

+0

당신이 보여주는 모든 것은 S4 방법 메커니즘과 관련이 있습니다. –

+0

예, 제 잘못입니다. 잘못된 번호. –

답변

22

R 그렇게

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

클래스 data.frameORvector 가상이다, '클래스 조합'을 가지고 있으므로 인스턴스화 할 수없는 있지만 포함 된 클래스 (contains=)과 같은 다른 슬롯 (representation=)에서 사용할 수 있습니다, 파견

에 대한
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 

방법은 당신이 알고있는 모든 슬롯이 클래스 조합의 부모 유형 중 하나를 포함하기 때문에 구현하기가 까다로울 수있다.

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" 

사실 ?Classes, ?Methods, ?setClass, 친구 도움에 대한 설명서를 찾을 수 있습니다. Hadley Wickham은 tutorial입니다 (이 페이지의 예제는 강하지 않습니다. Person을 인스턴스화하는 반면 개념적으로는 R의 벡터화 강도를 활용하기 위해 People을 작성합니다).이 최근 Bioconductor course에 섹션이 있습니다. 나는 어느 쪽이든이 노조들에 대해 상세하게 생각하지 않는다고 생각한다.

+6

마틴 모건 (Martin Morgan) - 너무 많은 실제 R 프로그래밍 질문에 대한 귀하의 훌륭한 답변은이 커뮤니티에 큰 도움이됩니다. 소품을주고 싶었고 그 점에 대해 고맙다. –

+0

동의하며 S4 질문에 대한 이전 답변은 매우 잘 설명되어 있습니다. –