【问题标题】:How to emulate Lisp's let function in R?如何在 R 中模拟 Lisp 的 let 函数?
【发布时间】: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


    【解决方案1】:

    这是一种方法:

    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 必须作为命名参数传递,否则它会被... 捕获,对吧?
    • @Ernest:是的。 ... 之后的所有参数都必须命名。
    • @Ernest -- 看看我刚刚添加的let() 的第二个版本。我认为它可能会解决您评论背后的问题......
    • ...或者把expr放在第一位:let &lt;- function(expr, ...) eval(substitute(expr), list(...))
    • @JoshO'Brien:第二个版本完全符合我的想法,谢谢。
    【解决方案2】:
    let <- function(a,b, expr=a+b){return(expr)}
    let(2,3)
    # [1] 5
    

    【讨论】:

    • 谢谢,但这似乎只适用于默认表达式——let(a=2,b=3,expr=a-b) 会出错。
    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2015-06-04
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多