【发布时间】:2014-01-27 06:06:20
【问题描述】:
R 中的所有连接函数都可以重写为递归函数。例如,我可以使用c 作为二元运算符,我可以定义一个新的concat 函数为
concat <- function(...) {
Reduce(c, ...)
}
而concat 将作为c 在R 基础中实际运行。
R 在语法上使用许多这样的函数,例如 c 用于向量和列表,cbind 用于数组、data.frames 和矩阵。在定义新的对象类时,使用以... 作为参数的函数来创建组合它们的方法是有意义的。
我知道当对象是参数列表中的第一个对象时,R 可以将方法与对象匹配,但是如果我定义一个类似的方法会怎样
concat <- function(...) {
UseMethod('concat')
}
concat.numeric <- function(...) {
c(...)
}
concat.character <- function(...) {
c(...)
}
myCon <- function(charPart, numPart) {
out <- list(charPart=charPart, numPart=numPart)
class(out) <- "myClass"
out
}
concat.myClass <- function(...) {
myCon(sapply(..., `[[`, 'charPart'), sapply(..., `[[`, 'numPart'))
}
> concat(4, 6, 'a')
"4" "6" "a"
> myObj1 <- myCon('a', 1)
> myObj2 <- myCon('b', 2)
> concat(myObj1, myObj2)
Error in get(as.character(FUN), mode = "function", envir = envir) :
object 'p' of mode 'function' was not found
R 在什么时候识别提供给concat 的参数类型?如何说服 R 尝试将参数转换为 concat 直到我的特定对象类?
【问题讨论】: