在 R 中进行非标准评估时部分评估表达式
Partially evaluate expression when doing non-standard evaluation in 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
我正在深入研究 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