2011-05-06 7 views
6

S3 개체를 포함하여 R 개체로 작업 할 S3 메서드를 작성하고 있습니다.S3 개체를 S4 개체와 함께 사용하려면 어떻게합니까?

이해가 안 우선은 S4 클래스 I 그냥 f.S4 발송 방법을 선언 할 수 있으며 모든 S4 객체를 데리러 그래서 f <- function(x) UseMethod("f") 지정해, S4 기본 클래스에서 파생 나타나지 않는 것입니다. (비록 당신이 unclass S4 객체라면, 클래스 S4이 주어진 것처럼 보입니다.) 디스패치를 ​​어떻게 관리해야합니까?

이러한 S4 개체를 처리하는 가장 쉬운 방법은 목록으로 변환하는 것입니다. 불행히도 as.list은 오류 ("이 S4 클래스를 벡터로 강제 변환 할 수 없습니다")를 throw합니다. 유망 보았다 methods 패키지

library(gWidgetstcltk) 
win <- gwindow() 

기능 S3PartS3Class,하지만 그들은 모두 던져 오류가 나는 win에 그들을 사용

이 내 테스트 S4 개체입니다

. 따라서 질문 2는 S4 객체를 목록으로 변환하는 일반적인 방법이 있습니까?

답변

6

S4는 직접 전달할 수없는 수퍼 클래스 (가상 클래스, 누구든지 올바른 이름으로 부름하십시오)입니다. S3와 동일합니다. S3 클래스로하는 것처럼 S4 클래스를위한 S3 디스패치를 ​​할 수 있습니다. sidenote에서 아무 것도 지정되지 않으면 S4 객체에서 myfun을 호출하면 .default 함수로 연결됩니다. : 모든 S4 방법을 잡을하려면

myfun <- function(object, ...) UseMethod("myfun") 

myfun.default <- function(object,...){ 
    cat("default method.\n") 
    print(object) 
} 

myfun.gWindow <- function(object,...){ 
    cat("Here here...") 
    print(object) 
} 

x <- 1:10 
myfun(x) 
myfun(win) 
rm(myfun.gWindow) 
myfun(win) 

, 당신은 isS4()를 사용하여 .DEFAULT 기능 또는 일반적인 기능에 직접 전달할 수 있습니다. .default 함수에 디스패치를 ​​추가하면 자동으로 S3 클래스를 S4 클래스로 디스패치 할 수 있습니다.

myfun.default <- function(object,...){ 
     if(isS4(object)) myfun.S4(object,...) 
     else { 
      cat("default method.\n") 
      print(object) 
     } 
    } 

    myfun.S4 <- function(object,...){ 
     cat("S4 method\n") 
     print(object) 
    } 

x <- 1:10 
myfun(x) 
myfun(win) 

두 번째 질문에 대해서는 : 당신이 일반에 추가하는 경우, 당신은 단지 모든 S4에 더-문제 - 무엇을 파견하지 gWindow는 특별한 경우이다. 또한 str(win)으로 시도하면 오류가 반환됩니다. 나는 정확한 구조를 모르지만 그것은 분명히 일반적인 S4 객체는 아닙니다.

+0

감사합니다. 파견은 훨씬 더 의미가 있습니다. 내가 까다로운 시험 경우에 비틀 거린 것처럼 보입니다. 몇 가지 다른 시도하고 더 조사해야합니다. –

+0

gwindow 객체는 실제로 나쁜 예입니다. gWidgets 객체에 대해 정의한 길이 메서드가 str을 엉망으로 만든다 고 생각합니다. gwindow 객체에는 툴킷 (gWidgetsXXX 패키지가 메소드 디스패치에 사용됨)을 유지하는 두 개의 슬롯과 gWidgetsXXX 패키지의 객체에 대한 슬롯이 있습니다. 그러나 Joris는 무엇을해야하는지 보여줍니다. gWindow에는 다른 클래스를 잡는 데 사용할 수있는 수퍼 클래스가 있습니다. – jverzani

+0

@ 존 : 설명해 주셔서 고맙습니다. 보다 쉬운 사례를 먼저 해결하는 데 집중하겠습니다. –

관련 문제