R中用户定义类的递归连接方法?

时间:2014-01-08 22:02:09

标签: r recursion

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直到我的特定对象类?

1 个答案:

答案 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"

..我认为是你想要的???