2015-01-11 4 views
7

나는 S4 클래스를 사용하여 패키지를 작성했으며 이러한 정의 된 클래스와 함께 rbind, cbind 함수를 사용하려고합니다.패키지의 s4 클래스와 함께 cbind, rbind를 사용하는 적절한 방법

바로 내가 대신 rbind2cbind2을 정의 S4 방법으로 rbindcbind을 정의 할 수있을 것 같지 않기 때문에 :

setMethod("rbind2", signature(x="ClassA", y = "ANY"), 
    function(x, y) { 
     # Do stuff ... 
}) 

setMethod("cbind2", signature(x="ClassA", y = "ANY"), 
    function(x, y) { 
     # Do stuff ... 
}) 

?cbind2에서 나는이 기능을 대체 할 methods:::bind_activation를 사용하여 활성화 할 필요가 있음을 알게 베이스에서 rbind 및 cbind. 예상대로이 작동

.onLoad <- function(...) { 
    # Bind activation of cbind(2) and rbind(2) for S4 classes 
    methods:::bind_activation(TRUE) 
} 

:

은 내가 .onLoad 기능을 사용하여 패키지 파일 R/zzz.R에 전화를 포함. 나는 참고 제거하고 적절한 방법이 cbind 정의하는 방법과 무엇을 얻을 수있는 방법

* checking dependencies in R code ... NOTE 
Unexported object imported by a ':::' call: 'methods:::bind_activation' 
    See the note in ?`:::` about the use of this operator. 

그러나, 실행 R의 CMD 나는 방법에 안 export 기능을 사용하고 있기 때문에 지금은 다음과 같은 메모를 얻고 확인 패키지에 포함 된 S4 클래스를 확인 하시겠습니까?

+0

'rbind'와'cbind' 메소드를 추가하려고하는 S4 클래스의 클래스 정의 (예 :'setClass ("ClassA", ...)')를 포함 하시겠습니까? 그것은 당신의 문제에 대한 해결책을 쉽게 만들어 줄 것입니다. – nrussell

+1

클래스 정의는 메소드 선택/디스 패칭의 문제 일 뿐이므로이 경우에는 중요하지 않습니다. 따라서 setClass ("ClassA", representation (a = "numeric"))와 같은 정의를 사용할 수 있습니다. – user625626

+0

또한 왜 "* ... rbind 및 cbind를 S4 메서드로 직접 정의 할 수없는 것 같은지 설명 할 수 있습니까?"- 아마도이 코드를 구현하려고 시도하는 코드를 추가 할 수 있습니까? – nrussell

답변

4

기본적으로 매트릭스 패키지의 cBind 도움말 페이지는 역사적으로 정확했지만 최근에는 그렇지 않다고 생각합니다. 여기에 '...'인수에 파견, 더 일반적인 없습니다

.A = setClass("A", representation(x="numeric")) 

클래스가, 그래서 하나를 만들

getGeneric("cbind") 
## NULL 
setGeneric("cbind", signature="...") 
## Creating a new generic function for 'cbind' in the global environment 

이 그런 방법을 구현 (?setMethod?dotsMethods 참조)

setMethod("cbind", "A", function(..., deparse.level=1) "cbind,A-method") 
## [1] "cbind" 

그리고 마지막으로 사용하십시오

> cbind(.A(), .A()) 
[1] "cbind,A-method" 

'...'인수가 동일한 (파생 된) 클래스 일 때도 괜찮습니다. 종종 충분히 좋습니다.

> cbind(.A(), integer()) 
    [,1] 
[1,] ? 

나는 bind_activation()이 아니라 패키지의 파견에 글로벌 효과를 가지고 있다고 생각합니다; 이를 피해야합니다 (예 : Matrix 패키지에서 더 이상 사용되지 않습니다).

또한, 나는이 R-의 devel 갱신 된 것을 생각


r67699 | 로렌스 | 2015-02-01 10:13:23 -0800 (Sun, 2015 년 2 월 1 일) | 4 lines

적어도 하나의 인수가 S4 개체이고 S3 디스패치가 실패하면 cbind2 (rbind2)에 cbind/rbind가 재귀 적으로 위임합니다. 또한 * bind 함수에서 S3 디스패치 중 S4 상속을 고려하십시오.