R指定功能环境

Sve*_*ger 4 environment r function call

我有一个关于R语言中的函数环境的问题。我知道每次在R中调用一个函数时,都会创建一个新环境E,在该环境中执行函数主体。E的父链接指向创建函数的环境。

我的问题:是否可以以某种方式指定环境E,即可以提供一种应在其中执行功能的特定环境吗?

Mel*_*Key 5

这是解决问题的另一种方法,直接取自http://adv-r.had.co.nz/Functional-programming.html

考虑代码

new_counter <- function() {
  i <- 0
  function() {
    i <<- i + 1
    i
  }
}
Run Code Online (Sandbox Code Playgroud)

(更新以提高准确性)外部函数创建一个环境,并将其保存为变量。调用此变量(函数)有效地调用内部函数,从而更新与外部函数关联的环境。(我不想直接复制 Wickham 的整个部分,但我强烈建议任何感兴趣的人阅读标题为“可变状态”的部分。我怀疑您可能会比这更奇特。例如,这里有一个带有重置选项的修改:

new_counter <- function() {
  i <- 0
  function(reset = FALSE) {
    if(reset) i <<- 0
    i <<- i + 1
    i
  }
}

counter_one <- new_counter()
counter_one()
counter_one()
counter_two <- new_counter()
counter_two()
counter_two()
counter_one(reset = TRUE)
Run Code Online (Sandbox Code Playgroud)

  • 太恶心了!不过我有点喜欢 (2认同)

MrF*_*ick 5

函数具有可以从函数外部更改的环境,但不能在函数本身内部更改。环境是函数的属性,可以使用进行检索/设置environment()。一个功能最多具有一个环境,但是您可以在不同的环境中复制该功能。

让我们为x设置一些环境。

x <- 0
a <- new.env(); a$x <- 5
b <- new.env(); b$x <- 10
Run Code Online (Sandbox Code Playgroud)

以及从环境foo中使用的功能x

foo <- function(a) {
    a + x
}
foo(1)
# [1] 1
Run Code Online (Sandbox Code Playgroud)

现在,我们可以编写一个帮助程序函数,可用于在任何环境下调用该函数。

with_env <- function(f, e=parent.frame()) {
    stopifnot(is.function(f))
    environment(f) <- e
    f
}
Run Code Online (Sandbox Code Playgroud)

实际上,这会返回分配了不同环境的新函数(或者,如果未指定,它将使用调用环境),我们可以通过传递参数来调用该函数。观察

with_env(foo, a)(1)
# [1] 6
with_env(foo, b)(1)
# [1] 11
foo(1)
# [1] 1
Run Code Online (Sandbox Code Playgroud)


Ian*_*ley 2

我不确定我是否完全跟踪了问题的目标。但是我们可以设置函数执行的环境,修改该环境中的对象,然后从全局环境中引用它们。这是一个说明性的例子,但我不知道这是否回答了提问者的问题:

e <- new.env()
e$a <- TRUE
testFun <- function(){
  print(a)
}
testFun()
Run Code Online (Sandbox Code Playgroud)

结果: print(a) 中出现错误:未找到对象“a”

testFun2 <- function(){
  e$a <- !(a) 
  print(a)
}
environment(testFun2) <- e
testFun2()
Run Code Online (Sandbox Code Playgroud)

返回:假

e$a 
Run Code Online (Sandbox Code Playgroud)

返回:假