重载日志功能

时间:2018-04-14 14:27:57

标签: r logging s4

我试图在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)
          }
)

虽然expround函数运行正常但log函数没有出现以下错误:

Error in match.call(definition, call, expand.dots, envir) :
unused argument (base = c("foo", ""))

这很令人困惑,因为args函数声明第二个(可选)参数的名称确实是base

你知道这是什么问题吗?感谢。

1 个答案:

答案 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