[R指定功能环境(R specify function environment)

2019-09-22 03:26发布

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

我的问题:是否可以指定环境E1不知何故,即可以一个提供一定的环境中执行的功能应该发生?

Answer 1:

这里还有一个解决问题的方法,直接取自http://adv-r.had.co.nz/Functional-programming.html

考虑代码

new_counter <- function() {
  i <- 0
  function() {
    i <<- i + 1
    i
  }
}

(更新以提高精度)的外函数创建一个环境,它被保存为变量。 调用此变量(函数)有效地调用内部功能,其更新与外功能相关联的环境。 (我不想直接复制韦翰的整个部分上,但我强烈建议有兴趣的人阅读标题为“可变状态”。我怀疑,你可以得到比这票友。例如,这里有一个重置选项修改:

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)


Answer 2:

一个函数,可以从功能外修改,而不是函数本身内部的环境。 环境是功能的一个属性,并且可以被检索/设置environment() 一个函数最多有一个环境,但你可以用不同的环境该函数的副本。

让我们设置一些环境与x值。

x <- 0
a <- new.env(); a$x <- 5
b <- new.env(); b$x <- 10

和函数foo使用x从环境

foo <- function(a) {
    a + x
}
foo(1)
# [1] 1

现在,我们可以写,我们可以用它来打电话与任何环境中的功能的辅助功能。

with_env <- function(f, e=parent.frame()) {
    stopifnot(is.function(f))
    environment(f) <- e
    f
}

这实际上将返回分配一个不同的环境的新功能(或者它使用的调用环境如果没有指定),我们可以通过只传递参数调用该函数。 守

with_env(foo, a)(1)
# [1] 6
with_env(foo, b)(1)
# [1] 11
foo(1)
# [1] 1


Answer 3:

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

e <- new.env()
e$a <- TRUE
testFun <- function(){
  print(a)
}
testFun()

结果在:错误打印的(a):对象“A”未找到

testFun2 <- function(){
  e$a <- !(a) 
  print(a)
}
environment(testFun2) <- e
testFun2()

返回:FALSE

e$a 

返回:FALSE



文章来源: R specify function environment