【问题标题】:Using functions inside environment and only here在环境中使用函数,仅在此处
【发布时间】:2016-05-01 14:21:40
【问题描述】:

我对 R 中的环境有一个小问题。 我在我的globalEnv 中有一个环境(我们称之为my.env),我想定义一个只使用my.env 中的变量的函数,所以我不必称它们为fun(my.env$foo) 而只是@ 987654325@.

有没有办法做到这一点?

【问题讨论】:

  • 您可以使用get 指定envirmy.env 获取对象。请展示一个可重现的示例,以便其他人可以理解您为什么不能使用my.env$foo

标签: r scope environment-variables


【解决方案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 

【讨论】:

  • 谢谢!效果很好,我使用了你的第三种方法:) 我会查看文档以获取有关替代品的更多信息,谢谢
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2019-03-16
  • 2019-01-26
  • 1970-01-01
相关资源
最近更新 更多