我希望使用整洁的eval框架来替换函数lazyeval::interp()。基本上,我有一个简单的表达:
library(rlang)
expr((a + 5 + b)/3)
#> (a + 5 + b)/3我想替换这个表达式,以便a和b符号分别变成c和d。对于懒虫来说,这很容易:
lazyeval::interp(expr((a + 5 + b)/3), a = expr(c), b = expr(d))
#> (c + 5 + d)/3该函数具有允许指定列表或环境的.values参数:
lazyeval::interp(expr((a + 5 + b)/3), .values=list(a = expr(c), b = expr(d)))
#> (c + 5 + d)/3
lazyeval::interp(expr((a + 5 + b)/3), .values=as.environment(list(a = expr(c), b = expr(d))))
#> (c + 5 + d)/3我天真地认为,我可以用不推荐的函数rlang::expr_interp -或者用rlang::inject()代替。事实并非如此:
expr_interp(expr((a + 5 + b)/3), as.environment(list(a = expr(c), b = expr(d))))
#> (a + 5 + b)/3我知道我可以使用基函数替代它(就像interp函数一样),但是我想找到一种修改表达式/调用的方法,以便一个符号可以被另一个符号替换为rlang。
发布于 2022-07-08 12:04:08
命名内插超出了tidyeval的范围。
https://stackoverflow.com/questions/72910566
复制相似问题