2

由 Venables 和 Ripley 编写的《统计与计算》一书有一个示例,说明在通用群函数 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 定义一个方法函数,当它在“多项式”类的对象上调用时。你能解释一下 switch 在这里做什么吗?我阅读了有关开关的 R 帮助,但仍然难以理解以下部分:

 switch(.Generic, ceiling = , floor = , 
            trunc = polynomial(callGeneric(x@coef), rat = x@rat),
            stop(paste(.Generic, "not allowed on polynomials"))
            )}

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

4

2 回答 2

3

我认为使用代码可以提供丰富的信息(我即将传播的这种理解完全来自我刚刚观察到的内容;我什至不知道您可以以这种方式使用 switch):

您的代码经过调整以在函数之外运行:

test <- "ceiling"
test <- "floor"
test <- "trunc"

switch(test, 
    ceiling = , 
    floor = , 
    trunc = mean(1:10),
    stop(paste(test, "not allowed on polynomials"))
)

尝试每个测试条件,您会看到如果天花板、地板或 trunc 它返回什么 trunc =。如果你把东西放在地板上:

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

感兴趣的是这种解释是否正确,但不熟悉这个特定的上下文。

于 2012-08-06T15:49:49.847 回答
1

.Generic标识用于调用当前函数的名称。你可以这样想:如果函数被调用为ceiling,floortrunc,则调用给定的实现polynomial(callGeneric(x@coef), rat = x@rat),否则会打印错误。在 an 之后的空参数,如and=所见,意味着失败:实际包含任何代码的下一个参数将是执行的。ceilingfloor

于 2012-08-06T15:52:00.063 回答