在R函数中执行表达式遇“object x not found”错误的求助
问题原因与解决方案
问题根源
你遇到的错误是R的词法作用域导致的:当你传入expr={cor(x)}时,表达式里的x会优先在表达式定义的环境(也就是调用test的全局环境)中查找,而非你在test函数内部创建的env环境。哪怕你把x存入env,表达式里的x依然绑定的是全局环境中的变量(如果全局环境没有x就会报错)。
解决方案
以下几种方法可以解决这个问题:
方法1:用substitute替换表达式变量
通过substitute捕获表达式,让其中的x绑定到函数参数的x,再在临时环境中执行:
test <- function(x, expr) { expr_sub <- substitute(expr) eval(expr_sub, envir = list(x = x)) } # 调用测试 test(iris, expr = cor(x))
方法2:使用rlang包的现代语法
用rlang的enexpr捕获表达式,eval_tidy在指定数据环境中执行:
library(rlang) test <- function(x, expr) { eval_tidy(enexpr(expr), data = list(x = x)) } # 调用测试 test(iris, expr = cor(x))
方法3:修改表达式的执行环境
如果坚持使用自定义环境,可以把表达式的环境设置为你创建的env,确保变量查找路径正确:
test <- function(x, expr) { env <- new.env() env$x <- x expr <- substitute(expr) environment(expr) <- env # 将表达式的环境指向自定义env eval(expr) } # 调用测试 test(iris, expr = cor(x))
内容的提问来源于stack exchange,提问作者sigbert
相关产品推荐
相关产品推荐

