我有一个关于R语言中函数环境的问题。
我知道每次在R中调用函数时,都会创建一个新的环境E来执行函数体。E的父链接指向创建函数的环境。
我的问题是:是否可以以某种方式指定环境E?也就是说,能否提供一个特定的环境来执行函数?
我有一个关于R语言中函数环境的问题。
我知道每次在R中调用函数时,都会创建一个新的环境E来执行函数体。E的父链接指向创建函数的环境。
我的问题是:是否可以以某种方式指定环境E?也就是说,能否提供一个特定的环境来执行函数?
函数具有一个环境,可以从函数外部更改该环境,但不能在函数内部更改。环境是函数的属性,可以使用 environment()
进行检索/设置。函数最多只有一个环境,但可以复制该函数并带有不同的环境。
让我们设置一些带有 x 值的环境。
x <- 0
a <- new.env(); a$x <- 5
b <- new.env(); b$x <- 10
同时还有一个函数 foo
,它使用了环境中的变量 x
and a function foo
that uses x
from the environment
同时还有一个函数 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
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)
我不确定我完全理解问题的目标。但是可以设置函数执行的环境,修改该环境中的对象,然后从全局环境引用它们。这里有一个说明性的例子,但我不知道是否回答了提问者的问题:
e <- new.env()
e$a <- TRUE
testFun <- function(){
print(a)
}
testFun()
结果为:打印(a)时出错:未找到对象'a'
testFun2 <- function(){
e$a <- !(a)
print(a)
}
environment(testFun2) <- e
testFun2()
e$a
?environment
中被描述,这种方式有什么问题吗? - Joshua Ulrich?with
和?eval
,后者是由with()
使用的较低级别函数。 - Gavin Simpson