제네릭 함수에 대한 새 메소드 설정에 관심이 있습니다. 예를 들어, 새 클래스가 있다고 가정 해 보겠습니다 (예 : coolClass
).R S4 setMethod에 대한 선택적 인수
setMethod("Math", c(x="coolClass"),
function(x)
{
op = .Generic[[1]]
switch(op,
`log10` = log10_for_coolClass(x),
stop("Undefined operation")
)
}
)
는 그러나, 나는 여러 인수를 전달하는 방법을 설정하는 방법을 알아낼 수 없습니까 : 나는 다음과 같은 코드로 방법을 설정 쉽게 그 클래스의 log10
를 계산하는 래퍼를 작성할 수 있습니다. 예를 들어 일반 log
메서드입니다. 다음 getGeneric("log")
을 보여줍니다 실행 :
> getGeneric("log")
standardGeneric for "log" defined from package "base"
belonging to group(s): Math
function (x, ...)
standardGeneric("log", .Primitive("log"))
<bytecode: 0x2f9a958>
<environment: 0x2f937f0>
Methods may be defined for arguments: x
Use showMethods("log") for currently available ones.
이를보고, 나는이 옵션 base
인수를 전달 할 수 있도록 다음과 같은 쓸 수 있습니다 기대.
Error in matchSignature(signature, fdef, where) :
'...' used in an incorrect context
내가 다른 오류 얻을 signature
에 ...
없이 시도 :
setMethod("Math", signature(x="coolClass",...),
function(x, ...)
{
op = .Generic[[1]]
switch(op,
`log` = log_for_coolClass(x, ...),
stop("Undefined operation")
)
}
)
는하지만 다음과 같은 오류 얻을
Error in rematchDefinition(definition, fdef, mnames, fnames, signature) :
methods can add arguments to the generic ‘Math’ only if '...' is an argument to the generic
주어진 나에게 이상한 것 같다 getGeneric
로그 프로그램이 메소드의 ...
.
아이디어가 있으십니까? 추가 인수를 포착 할 수있는 방법이 있습니까? 나는 S4 메쏘드에 좀 더 익숙해 지려고 노력하고 있지만 선택적인 인자들을 전달하는 방법에 대해서는 혼란 스럽다. 만약 이것이 가능하지 않다면, 누군가가 log
함수가 어떻게 동작 하는지를 설명 할 수 있다면 감사 할 것입니다. 예를 들어 함수가 Math
그룹의 일부이지만 다중 인수를 허용하는 경우입니다. 아래 언급 된
업데이트
이상하게도, 나는 다음과 log
에 직접 setMethod
를 사용할 수 있습니다
setMethod("log", signature(x="big.matrix"),
function(x, base=exp(1))
{
log_for_coolClass(x, base=base)
}
)
그러나이 꽤 나의 호기심을 진정하지 않습니다. 예를 들어, Math
그룹 내에 많은 새로운 메소드를 만들면 코드에서 반복적 인 것이 이상하게 보입니다. 이상적으로는 다음과 같이 보일 것입니다 :
setMethod("Math", c(x="coolClass"),
function(x, base=exp(1))
{
op = .Generic[[1]]
switch(op,
`log10` = log10_for_coolClass(x),
`log` = log_for_coolClass(x, base=base),
stop("Undefined operation")
)
}
)
대답은'setMethod'를'log'에 직접 발견 한 것과 같습니다. 'callGeneric'을 사용하여 모든 수학 연산에 액세스하는 것은 흥미 롭습니다. 그러나 클래스에는 별도로 작성하고 호출해야하는보다 복잡한 함수가 필요합니다. 따라서 특정 방법을 별도로 설정해야하는 것으로 보입니다. 더 간결하게 (업데이트 된 질문 참조) 바라고 있었지만 그것이 유일한 방법 일 경우. – cdeterman