R中的所有连接函数都可以重写为递归函数。例如,我可以使用c
作为二元运算符,我可以将新的concat
函数定义为
concat <- function(...) {
Reduce(c, ...)
}
和concat
将起到c
实际上在R base中的作用。
R语法上使用了许多这样的函数,例如c
用于向量和列表,cbind
用于数组,data.frames和矩阵。在定义新的对象类时,使用以...
作为参数的函数创建一个组合它们的方法是有意义的。
我知道当R是参数列表中的第一个对象时,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
直到我的特定对象类?
答案 0 :(得分:1)
你还没有把你想到的sapply
传递给list(...)
,因此sapply
可以遍历这些元素而不是将它们解析为额外的参数错误的地方。
concat.myClass <- function(...)
{
myCon(sapply(list(...), `[[`, 'charPart'), sapply(list(...), `[[`, 'numPart'))
}
> myObj1
$charPart
[1] "a"
$numPart
[1] 1
attr(,"class")
[1] "myClass"
> myObj2
$charPart
[1] "b"
$numPart
[1] 2
attr(,"class")
[1] "myClass"
然后给出:
> concat(myObj1, myObj2)
$charPart
[1] "a" "b"
$numPart
[1] 1 2
attr(,"class")
[1] "myClass"
..我认为是你想要的???