如何判断函数参数是否作为表达式而不进行评估?

时间:2014-06-28 06:15:58

标签: r expression eval

这是一个将表达式作为参数的简单函数。

f <- function(expr) {
  expr <- substitute(expr)
  eval(expr)
}

(在实践中,我还需要在函数中稍微操作表达式,并且可以在其他有意义的环境中评估表达式)

我们致电

时工作正常
f(1+1)

直接提供未评估的论点。

但是,我需要f也能像我在外部提供明确定义的表达式一样工作,例如,

q <- quote(1+1)
f(q)

f(expr)需要避免替换expr并返回表达式的值。但是,上面的代码不起作用,因为它导致表达式本身而不是2。

所以问题是:如何在没有在当前环境中对其进行评估的情况下判断参数是否作为表达式?

2 个答案:

答案 0 :(得分:3)

也许你想检查一下你是否通过了“名字”而不是“通话”

f <- function(expr) {
    expr <- substitute(expr)
    if(is.name(expr)) {
        expr <- eval(expr, parent.frame())
    }
    eval(expr)
}


f(1+1)
# [1] 2

q<-quote(1+1)
f(q)
# [1] 2

答案 1 :(得分:0)

可能有更好的方法,但这是一种方法:

f <- function(expr) {
    mess <- suppressWarnings(try(expr, silent = TRUE))
    if (inherits(mess, "try-error")) {
        expr <- substitute(expr)
    }

    eval(expr)
}

f(1+1)
## [1] 2

q <- quote(1+1)
f(q)
## [1] 2

此位将其扩展为字符向量:

f <- function(expr) {
    mess <- suppressWarnings(try(expr, silent = TRUE))
    if (inherits(mess, "try-error")) {
        expr <- substitute(expr)
    }

    if (is.character(expr)) return(eval(parse(text=expr)))
    eval(expr)
}

f("1 + 1")
## [1] 2

我建议从Hadley的高级R中读取这一位HERE