只在这里使用环境中的功能

时间:2016-01-25 10:07:52

标签: r scope environment-variables

我对R中的环境有一点疑问。 我在my.env内有一个环境(让我们称之为globalEnv),我想定义一个只使用my.env内部变量的函数,所以我不必将它们称为fun(my.env$foo),而只需fun(foo)

有办法吗?

1 个答案:

答案 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