我对R中的环境有一点疑问。
我在my.env
内有一个环境(让我们称之为globalEnv
),我想定义一个只使用my.env
内部变量的函数,所以我不必将它们称为fun(my.env$foo)
,而只需fun(foo)
。
有办法吗?
答案 0 :(得分:1)
您似乎想要非标准评估。这通常涉及substitute
。
my.env <- new.env()
my.env$a <- 1:5
my.env$b <- 2
fun <- function(x, y, env = my.env) {
x <- eval(substitute(x), envir = env)
y <- eval(substitute(y), envir = env)
x^y
}
fun(a, b)
#[1] 1 4 9 16 25
但请注意eval
如何跟随搜索路径(get
也会这样做):
rm(b, envir = my.env)
ls(my.env)
#[1] "a"
b <- 3
fun(a, b)
#[1] 1 8 27 64 125
my.env$b <- 4
fun(a, b)
#[1] 1 16 81 256 625
如果这是不可接受的,你可以这样做:
fun1 <- function(x, y, env = my.env) {
x <- env[[as.character(substitute(x))]]
y <- env[[as.character(substitute(y))]]
stopifnot(!is.null(x), !is.null(y))
x^y
}
fun1(a, b)
#[1] 1 16 81 256 625
rm(b, envir = my.env)
fun1(a, b)
#Error: !is.null(y) is not TRUE