【发布时间】:2012-04-04 18:35:33
【问题描述】:
我正在尝试编写一个 let 函数,它允许我执行以下操作:
let(a=2, b=3, a+b)
>>> 5
目前我被困住了
let <- function(..., expr) {
with(list(...), quote(expr))
}
这根本不起作用。任何帮助表示赞赏。
【问题讨论】:
标签: r functional-programming evaluation
我正在尝试编写一个 let 函数,它允许我执行以下操作:
let(a=2, b=3, a+b)
>>> 5
目前我被困住了
let <- function(..., expr) {
with(list(...), quote(expr))
}
这根本不起作用。任何帮助表示赞赏。
【问题讨论】:
标签: r functional-programming evaluation
这是一种方法:
let <- function(..., expr) {
expr <- substitute(expr)
dots <- list(...)
eval(expr, dots)
}
let(a = 2, b = 3, expr = a+b)
# [1] 5
编辑:或者,如果您不想命名要评估的表达式(即通过expr 传递它),和 如果你确定它永远是最后一个参数,你可以这样做。
let <- function(...) {
args <- as.list(sys.call())[-1]
n <- length(args)
eval(args[[n]], args[-n])
}
let(a = 2, b = 3, a + b)
# [1] 5
【讨论】:
expr 必须作为命名参数传递,否则它会被... 捕获,对吧?
... 之后的所有参数都必须命名。
let() 的第二个版本。我认为它可能会解决您评论背后的问题......
expr放在第一位:let <- function(expr, ...) eval(substitute(expr), list(...))
let <- function(a,b, expr=a+b){return(expr)}
let(2,3)
# [1] 5
【讨论】:
let(a=2,b=3,expr=a-b) 会出错。