我有一个关于R语言功能的环境问题。 我知道,每次一个函数被调用R,新的环境E1创建在其中执行函数体。 E的父链接指向在其中创建该函数的环境。
我的问题:是否可以指定环境E1不知何故,即可以一个提供一定的环境中执行的功能应该发生?
我有一个关于R语言功能的环境问题。 我知道,每次一个函数被调用R,新的环境E1创建在其中执行函数体。 E的父链接指向在其中创建该函数的环境。
我的问题:是否可以指定环境E1不知何故,即可以一个提供一定的环境中执行的功能应该发生?
这里还有一个解决问题的方法,直接取自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)
一个函数,可以从功能外修改,而不是函数本身内部的环境。 环境是功能的一个属性,并且可以被检索/设置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
我不知道我完全跟踪问题的目标。 但一个可以设置一个函数执行的环境中,修改该环境中的对象,然后从全球环境中引用它们。 下面是一个说明性的例子,但同样,我不知道这是否回答了提问者的问题:
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