2016-06-01 4 views
0

내 자신의 S4 클래스 객체에 대해 Matrix 패키지에서 rankMatrix 함수를 정의한다고 가정 해 봅시다. 실행중인 R 세션에서 이렇게하면 간단 할 것 같다함수를 제네릭으로 설정하고 패키지 내에서 다른 인수로 오버로드하는 올바른 방법

library(devtools); library(roxygen2); library(Matrix) 

######################################################## 
################ code used in the package ############## 

#' testclass 
#' 
#' @import Matrix 
#' @import methods 
#' @export 
setClass("MatrixReloaded", slots = list(sl = "Matrix", sr = "Matrix")) 

#' constructor of MatrixReloaded 
#' @export 
MatrixReloaded <- function(x, y) new("MatrixReloaded", sl = x, sr = y) 

# make rankMatrix generic 
setGeneric("rankMatrix", Matrix::rankMatrix) 

# and define new method for class MatrixReloaded 
setMethod("rankMatrix", signature(x = "MatrixReloaded"), 
      function(x, tol) 
      rankMatrix(x = [email protected], tol = tol) + 
      rankMatrix(x = [email protected], tol = tol) 
     ) 

######################################################## 
######################################################## 

# Create a MatrixReloaded object 
(newobj <- MatrixReloaded(Diagonal(1), Matrix(1:10, ncol=2))) 

#### and compare results 

# sum the ranks individually -- works as rankMatrix 
# can handle objects of class Matrix per default 
rankMatrix([email protected]) + rankMatrix([email protected]) 
rankMatrix(newobj) # call rankMatrix on the actual MatrixReloaded object 

이 잘 작동하도록 ... 특히, methods("rankMatrix")

rankMatrix,ANY-method rankMatrix,MatrixReloaded-method 

산출 실제 문제

내가 만약 보인다 클래스, 생성자뿐만 아니라 rankMatrix에 관한 행을 포함하는 패키지를 빌드 한 다음 새로운 R 세션을 시작하고 설치하고 package, 0을로드하십시오은 동일한 결과를 제공하지만 rankMatrix(newobj)은 함수가 올바른 클래스에 대해 호출되지 않았기 때문에 실패합니다.

  • 내가 뭘 잘못 했니?
  • 인수가 일반 기본 함수의 인수와 정확히 일치해야합니까?
  • 예인 경우 기본 기능의 인수를 무시하는 방법이 있습니까 (예 :: rankMatrix). 을 MatrixReloaded 개체에서 실행하지 않으려합니다.
+0

'newobj @ sl'이 MatrixReloaded 클래스의 적절한 구조를 가지지 않을 것이라고 생각합니다. 그것은 단지 Matrix가 될 것이고, rankMatrix는 그 서명을 가진 아이템을위한 메소드를 가지고 있지 않습니다. –

+0

@ 42- : 귀하의 의견을 보내 주셔서 감사합니다. 끝에서 두 번째 줄은 마지막 행의'MatrixReloaded' 객체'newobj'에있는'rankMatrix' 함수가 올바른 일을하는지, 즉 두 단일 행렬의 순위를 합산하는지에 대한 검사 일뿐입니다. 'rankMatrix' ('Matrix' 패키지의 일부로서)는'Matrix' 객체와 함께 사용할 수있는 방법으로 작성되었습니다. 그러나이 클래스에 대한 명시적인 메소드는 없습니다. – DavidR

답변

0

첫 번째 문제에 대한 해결책은 매우 간단합니다. 예를 들어, @export을 잊었습니다. 명시된 here