2011-12-07 2 views
4

저는 show가 S4 generic이라는 사실을 알게되어 기쁩니다. 그리고 show function을 사용하기 위해 S3 디스 패칭을 사용할 방법을 찾을 수 없습니다. 간단한 데모 :S3 클래스에 대한 show 메소드를 정의하십시오.

> x <- 1:5 
> xx <- structure(x,class="aClass") 

> show.aClass <- function(object){ 
+  cat("S3 dispatching.\n") 
+  print(object) 
+ } 

> xx 
[1] 1 2 3 4 5 

없음 S3 여기에 파견 ...

> setMethod("show","aClass",function(object){ 
+  cat("S4 dispatching.\n") 
+  print(object) 
+ }) 
in method for ‘show’ with signature ‘"aClass"’: no definition for class “aClass” 
[1] "show" 

> xx 
[1] 1 2 3 4 5 

당신은 어떻게 생각 했습니까?

> print.aClass <- function(object){ 
+  cat("the print way...\n") 
+  print(as.vector(object)) #drop class to avoid infinite loop! 
+ } 

> xx 
the print way... 
[1] 1 2 3 4 5 

인쇄용으로 사용됩니다.

S3에 머물러야 할 좋은 이유가 있습니다. (그 중 큰 부분은 오버 헤드 최소화입니다. 객체는 부트 스트래핑에서 광범위하게 사용됩니다). 여기에 다른 쇼 및 인쇄 방법을 어떻게 정의해야합니까?

+0

S3의 'show'메소드를 정의하고 싶을 때 간단하게 할 수 있지만, S4 show 메소드를 삭제하지 않고 그 일을 할 수있는 방법을 찾지 못했습니다. – Andrie

+0

@ 앤드류 : 그것은 까다 롭습니다. 안 그래요? –

+0

Show는 S4 인쇄와 같습니다. 왜 각기 다른 결과가 필요한지 확신 할 수 없습니다. – hadley

답변

3

어쩌면

setOldClass("aClass") 
setMethod(show, "aClass", function(object) cat("S4\n")) 
print.aClass <- function(object) { cat("S3... "); show(object) } 

다음

> structure(1:5, class="aClass") 
S3... S4 

하지만 난 정말 당신이 원하는 것을 이해하고 있지 않다.

+0

setOldClass ... 어떻게 그걸 잊었 니? 콘솔에서 이름을 입력 할 때 객체에 대한 간단한 개요를 얻으려고합니다. 그러나 print() 함수를 사용할 때 약간의 외형이 좋습니다. 그동안 동료가 예상 한 행동으로는 거의 예상되지 않는 행동을하는 것을 잊어 버렸습니다. 어쨌든 대답은 Thx. –