如何让R函数在本地环境中读取公式并获取局部变量?
问题分析与解决方案
问题原因
这段代码报错的核心是:公式Y ~ X在main()函数的本地环境中创建,而foo()里调用get()时,默认只会在自身函数环境和全局环境里查找对象,找不到main()中定义的局部变量Y。公式对象本身会携带创建它时的环境信息,我们需要利用这个特性指定查找范围。
修改方法
方法1:通过get()的env参数指定公式环境
修改foo函数,明确传入公式的创建环境:
foo <- function(formula){ # 获取公式创建时的环境 formula_env <- environment(formula) Y <- get(formula[[2]], envir = formula_env) print(Y) } main <- function(){ Y <- 1 X <- 2 foo(Y ~ X) } main()
方法2:用eval()直接在公式环境中求值
eval()可直接在指定环境解析符号,写法更简洁:
foo <- function(formula){ Y <- eval(formula[[2]], envir = environment(formula)) print(Y) } main <- function(){ Y <- 1 X <- 2 foo(Y ~ X) } main()
两种方法都能让foo()正确读取main()里的局部变量Y,运行后会输出1。
内容的提问来源于stack exchange,提问作者温泽海
相关产品推荐
相关产品推荐

