Hadley Wickham最近在r-devel邮件列表上提出了一个有趣的问题,并且无法在StackOverflow上找到关于该主题的现有问题,我认为它也可能对它有用.
换句话说:
R函数由三个元素组成:参数列表,正文和环境.我们可以从这三个元素以编程方式构造函数吗?
(在上面的r-devel链接的主题结尾处得到了一个相当全面的答案.我将让其他人重新开放各种解决方案本身的基准并提供它作为答案,但一定要引用哈德利如果你这样做的话.如果没有人在几个小时内加强,我会自己做.)
我正在为lambdas创建一个快捷方式,因为重复使用了function (…) …我的代码.作为补救措施,我正在尝试使用其他语言(如Haskell)启发的替代语法,只要在R. Simplified中可以实现,我的代码如下所示:
f <- function (...) {
args <- match.call(expand.dots = FALSE)$...
last <- length(args)
params <- c(args[-last], names(args)[[last]])
function (...)
eval(args[[length(args)]],
envir = setNames(list(...), params),
enclos = parent.frame())
}
Run Code Online (Sandbox Code Playgroud)
这允许以下代码:
f(x = x * 2)(5) # => 10
f(x, y = x + y)(1, 2) # => 3
Run Code Online (Sandbox Code Playgroud)
等等
当然,真正的目的是将它与高阶函数1一起使用:
Map(f(x = x * 2), 1 : 10)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我有时必须嵌套高阶函数然后它停止工作:
f(x = Map(f(y = x + y), 1:2))(10)
Run Code Online (Sandbox Code Playgroud)
产生"错误eval(expr, …