gpt4 book ai didi

R bquote 的反向行为

转载 作者:行者123 更新时间:2023-12-02 09:14:56 25 4
gpt4 key购买 nike

bquote 函数允许计算包含在 .() 调用中的表达式部分。例如,

a <- 2
b <- 100
bquote(.(2 * a) * x + .(log10(b)))

会返回

4 * x + 2

我想重写此函数来评估除 .() 调用内的内容之外的所有内容。这是所需的行为:

a <- 2
b <- 100
bquote(2 * a * .(x) + log10(b))

> 4 * x + 2

我知道要做到这一点,我必须检查 abstract syntax tree并在没有 .() 调用的情况下评估早午餐,但我无法处理所有这些递归。

你能帮我写一个这样的函数吗?

最佳答案

subst 将替换除 .(...) 内的变量之外的所有变量,并且 simplify 函数将简化没有变量的子树 - 省略简化部分如果不需要简化。没有使用任何包。

subst <- function(e) {
if (typeof(e) == "language") {
if (identical(e[[1]], as.name("."))) e[[2]]
else {
if (length(e) > 1) e[-1] <- lapply(as.list(e[-1]), subst)
e
}
} else {
eval(e)
}
}

simplify <- function(e) {
if (typeof(e) == "language") {
if (length(all.vars(e))) {
if (length(e) > 1) {
e[-1] <- lapply(as.list(e[-1]), simplify)
e
} else e
} else eval(e)
} else e
}

inverse_bquote <- function(x, SIMPLIFY = TRUE) {
result <- subst(substitute(x))
if (SIMPLIFY) simplify(result) else result
}

现在测试一下。

a <- 2
b <- 100

inverse_bquote(2 * a * .(x) + log10(b))
## 4 * x + 2

# without simplification

inverse_bquote(2 * a * .(x) + log10(b), SIMPLIFY = FALSE)
## 2 * 2 * x + log10(100)

更新:添加了简化。将其设为可选。

关于R bquote 的反向行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48053327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com