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
개체에서 실행하지 않으려합니다.
'newobj @ sl'이 MatrixReloaded 클래스의 적절한 구조를 가지지 않을 것이라고 생각합니다. 그것은 단지 Matrix가 될 것이고, rankMatrix는 그 서명을 가진 아이템을위한 메소드를 가지고 있지 않습니다. –
@ 42- : 귀하의 의견을 보내 주셔서 감사합니다. 끝에서 두 번째 줄은 마지막 행의'MatrixReloaded' 객체'newobj'에있는'rankMatrix' 함수가 올바른 일을하는지, 즉 두 단일 행렬의 순위를 합산하는지에 대한 검사 일뿐입니다. 'rankMatrix' ('Matrix' 패키지의 일부로서)는'Matrix' 객체와 함께 사용할 수있는 방법으로 작성되었습니다. 그러나이 클래스에 대한 명시적인 메소드는 없습니다. – DavidR