了解R中的功能开关()?

时间:2012-08-06 15:30:35

标签: r function generics s4

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"))
            )}

请注意,上面的多项式函数是一个构造函数,用于创建“多项式”类的对象。

2 个答案:

答案 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标识用于调用当前函数的名称。您可以这样想:如果函数被调用为ceilingfloortrunc,则调用给定的实现polynomial(callGeneric(x@coef), rat = x@rat),否则会打印错误。 =之后的空参数(如ceilingfloor所示)表示直通:实际包含任何代码的下一个参数将是执行的参数。