R语言如何实现函数接收任意表达式并在指定环境执行并存储结果
问题原因
核心问题是表达式参数的求值时机和执行环境未正确配置:
- 直接将
expr传入with_env时,expr会先在set_in_env的函数内部环境被求值,而非作为未执行的表达式传入新建的空白环境e中运行 - 你之前尝试用
enquo捕获表达式后调用eval_tidy时未指定env参数,赋值操作会默认落在set_in_env的内部环境,不会写入你创建的e环境
解决方案
rlang 实现方案
通过enquo捕获调用方传入的未求值表达式,调用eval_tidy时指定执行环境为你新建的e即可:
library(rlang) set_in_env <- function(expr) { e <- new.env() # 捕获调用方传入的未求值表达式 q <- enquo(expr) # 指定在e环境中执行该表达式 eval_tidy(q, env = e) # 执行函数内部的赋值逻辑 with_env(e, {x <- 1}) return(e) } # 测试 e <- set_in_env({y <- 2}) env_print(e)
base R 实现方案
如果不需要依赖rlang包,也可以用base函数实现相同效果:
set_in_env <- function(expr) { e <- new.env() # 捕获调用方传入的未求值表达式,指定在e环境执行 eval(substitute(expr), envir = e) # 执行内部赋值 eval(quote(x <- 1), envir = e) return(e) }
验证结果
两种方案运行后,e环境的绑定都会包含x和y两个变量,符合预期需求:
> rlang::env_print(e) <environment: 0x0000020ff44a7660> parent: <environment: R_GlobalEnv> bindings: * x: <dbl> * y: <dbl>
内容的提问来源于stack exchange,提问作者Wasabi
相关产品推荐
相关产品推荐

