【问题标题】:Methods for recursive concatenations on user defined classes in R?R中用户定义类的递归连接方法?
【发布时间】: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 直到我的特定对象类?

【问题讨论】:

    标签: r recursion


    【解决方案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"
    

    ..我想这就是你想要的???

    【讨论】:

    • 哎呀!感谢您的调试。我想我正在尝试做的事情没有任何问题。
    • 没问题。关于你正在尝试做的事情......只要你没有为大量数据的大量操作设计代码就可以了,因为 R 没有编译并且深度递归函数(例如斐波那契、素数查找器、牛顿法)更好不是这样编程的……否则很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多