我试图在S4类的上下文中重载一些函数。以下是示例代码:
foo <- setClass(
Class = "foo",
slots = c("name" = "character", "value" = "numeric")
)
setMethod(f = "exp",
signature = c(x = "foo"),
definition = function(x) {
exp(x@value)
}
)
setMethod(f = "round",
signature = c(x = "foo", digits = "foo"),
definition = function(x, digits) {
round(x@value, digits@value)
}
)
setMethod(f = "log",
signature = c(x = "foo", base = "foo"),
definition = function(x, base) {
log(x@value, base@value)
}
)
虽然exp
和round
函数运行正常但log
函数没有出现以下错误:
Error in match.call(definition, call, expand.dots, envir) :
unused argument (base = c("foo", ""))
这很令人困惑,因为args
函数声明第二个(可选)参数的名称确实是base
。
你知道这是什么问题吗?感谢。
答案 0 :(得分:0)
从log
的帮助页面
&#34;请注意,这意味着日志的S4泛型具有仅带有一个参数x的签名,但该基础可以传递给方法(但不会用于方法选择)。另一方面,如果您只为Math group generic设置一个方法,那么您的类将忽略log的base参数。&#34;
所以,你不能使用&#34; base&#34;在你的签名。如果您确实需要在base
参数上进行调度,则必须编写第二个通用:
myLog <- function(x,base) log(x,base)
setGeneric(myLog,signature=c("x","base"))
在另一个问题上,您不需要为每个函数编写单独的定义,您可以使用 group generics 。在您的示例中,您可以编写
setMethod("Math","foo",function(x)callGeneric(x@value))
或可能
setMethod("Math","foo",function(x,...)callGeneric(x@value,...))
这一行代码将全部用于
[1] "abs" "sign" "sqrt" "ceiling" "floor" "trunc" "cummax" "cummin"
[9] "cumprod" "cumsum" "exp" "expm1" "log" "log10" "log2" "log1p"
[17] "cos" "cosh" "sin" "sinh" "tan" "tanh" "acos" "acosh"
[25] "asin" "asinh" "atan" "atanh" "cospi" "sinpi" "tanpi" "gamma"
[33] "lgamma" "digamma" "trigamma"
根据需要工作(通过在@value
的{{1}}位置操作)。您可能还想对foo
执行类似的操作,其中包括math2
。
实现你想要的第三种方式是让你的&#34; foo&#34; class extend 数字类:
round
然后一切都好像对象实际上是数字一样。如果你需要进入&#34;数据部分&#34;对于setClass("foo",
slots = c("name" = "character"),
contains="numeric"
) -> foo
类的对象x
,您可以使用foo
。