我正在深入研究 R 的非标准评估机制。到了一半,我仍然不时被卡住。;-)
我做了一些calculator
漂亮的打印计算和结果:
calculator <- function(e) cat(deparse(substitute(e)), "=", e)
这工作正常:
calculator(1 + 2)
印刷:
1 + 2 = 3
但是,当调用calculator
with 时:
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
..这和我的第一个版本一样..