在 R 中进行非标准评估时部分评估表达式



我正在深入研究R的非标准评估机制。中途,我仍然时不时地被困住。;-)

我做了一个小calculator,漂亮地打印了计算结果:

calculator <- function(e) cat(deparse(substitute(e)), "=", e)

这工作正常:

calculator(1 + 2)

指纹:

1 + 2 = 3

但是,当调用calculator时:

a <- 1; b <- 2
calculator(a + b)

输出为:

a + b = 3

如何调整我的calculator以便在后一种情况下也能打印1 + 2 = 3


我试过了:

calculator2 <- function(e) {
  ex <- lapply(substitute(e), function(x) ifelse(is.numeric(x), eval(x), x))
  cat(deparse(ex), "=", e)
}
calculator2(1 + 2)
# list(+, 1, 2) = 3
calculator2(a + b)
# list(+, a, b) = 3

这显然是行不通的。lapply调用后,我有一个列表,cat list(+, 1, 2)打印到控制台。

所以我又试了一次:

calculator3 <- function(e) {
  ex <- substitute(e)
  for(i in 1:length(ex)) {
    if(is.numeric(ex[[i]])) ex[[i]] <- eval(ex[[i]])
  }
  cat(deparse(ex), "=", e)
}
calculator3(1 + 2)
# 1 + 2 = 3
calculator3(a + b)
# a + b = 3

..这与我的第一个版本相同。

这适用于具有一个运算符的表达式。对于更复杂的表达式(嵌套函数调用(,需要使用递归而不是简单循环。

a <- 1; b <- 2
calculator1 <- function(e) {
  expr <- substitute(e)
  evalexpr <- lapply(expr, eval) #evaluate each part of expression
  numind <- vapply(evalexpr, is.numeric, FUN.VALUE = logical(1))
  expr[numind] <- evalexpr[numind]
  cat(deparse(expr), "=", e)
}
calculator1(a + b)
#1 + 2 = 3
calculator1(1 + 2)
#1 + 2 = 3

最新更新