Venables和Ripley编写的“统计与计算”一书中有一个关于为通用组函数Math定义“多项式”类对象的方法函数的例子。 Math是一个具有一些组件功能的组函数,包括abs,acos,acosh,......
下面是本书中提到的用于定义组泛型函数Math的方法函数的代码(注意代码用于S4类(新式R / S类)):
setMethod("Math", "polynomial",
function(x) {
switch(.Generic, ceiling = , floor = ,
trunc = polynomial(callGeneric(x@coef), rat = x@rat),
stop(paste(.Generic, "not allowed on polynomials"))
)}
)
据我所知,使用setMethod()时,我们在泛型函数Math中为类“多项式”的对象调用时定义了一个方法函数。你能解释一下这里有什么开关吗?我在开关上阅读了R帮助,但仍然难以理解下面的部分:
switch(.Generic, ceiling = , floor = ,
trunc = polynomial(callGeneric(x@coef), rat = x@rat),
stop(paste(.Generic, "not allowed on polynomials"))
)}
请注意,上面的多项式函数是一个构造函数,用于创建“多项式”类的对象。
答案 0 :(得分:3)
我认为使用代码可以获得丰富的信息(我要传播的这种理解纯粹来自我刚刚观察到的内容;我甚至不知道你可以用这种方式使用开关):
你的代码被调整为在函数之外运行:
test <- "ceiling"
test <- "floor"
test <- "trunc"
switch(test,
ceiling = ,
floor = ,
trunc = mean(1:10),
stop(paste(test, "not allowed on polynomials"))
)
尝试每个测试条件,你会看到如果天花板,地板或截断它返回截断=
。如果你把东西放在地板上:
test <- "floor"
switch(test,
ceiling = ,
floor = 5,
trunc = mean(1:10),
stop(paste(test, "not allowed on polynomials"))
)
你会得到不同的回应。
我可能错了,但我认为这可以写成:
if (.Generic %in% c(ceiling, "floor", "trunc"){
polynomial(callGeneric(x@coef), rat = x@rat)
} else {
stop(paste(.Generic, "not allowed on polynomials"))
}
感兴趣,如果这种解释是正确的,但我不熟悉这种特定背景。
答案 1 :(得分:1)
.Generic
标识用于调用当前函数的名称。您可以这样想:如果函数被调用为ceiling
,floor
或trunc
,则调用给定的实现polynomial(callGeneric(x@coef), rat = x@rat)
,否则会打印错误。 =
之后的空参数(如ceiling
和floor
所示)表示直通:实际包含任何代码的下一个参数将是执行的参数。