【发布时间】:2018-09-23 05:07:16
【问题描述】:
我想在 R 中创建一个“compose”函数,它将组合任意数量的作为参数给出的函数。
到目前为止,我已经通过定义一个由两个参数组成的函数“of”然后对它进行归约来实现这一点:
of <- function(f,g) function(x) f(g(x))
id <- function(x) x
compose <- function(...) {
argms = c(...)
Reduce(of,argms,id)
}
这似乎工作正常,但由于我正在学习 R,我想我会尝试以明确的递归风格编写它,即放弃使用 Reduce,iow 那种你会在 Scheme 中做的事情像这样:
(define (compose . args)
(if (null? args) identity
((car args) (apply compose (cdr args)))))
我遇到了许多障碍,目前主要的障碍似乎是参数的第一个元素没有被识别为函数。到目前为止我的弱尝试:
comp <- function(...) {
argms <- list(...)
len <- length(argms)
if(len==0) { return(id) }
else {
(argms[1])(do.call(comp,argms[2:len]))
}
}
吐槽:Error in comp(sin, cos, tan) : attempt to apply non-function
一定有某种方法可以做到这一点,这让我望而却步。有什么建议吗?
【问题讨论】:
-
purrr包包含另一个替代方案,它不使用 Reduce 或递归。由于您正在学习 R,它可能会为您的任务提供更多见解:github.com/tidyverse/purrr/blob/master/R/compose.R -
@Artem Sokolov:这是一个有趣的实现——迭代和累积到一个可变变量中。有点像你说的我要求的(递归的,不可变的)完全相反,但仍然很好看,尤其是在学习时。感谢您不厌其烦地链接它!
标签: r functional-programming function-composition