首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R指定函数环境

R指定函数环境
EN

Stack Overflow用户
提问于 2012-09-05 18:09:42
回答 3查看 6K关注 0票数 11

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

我的问题是:有没有可能以某种方式指定环境E,即,是否可以提供一个特定的环境,在这个环境中应该发生函数执行?

EN

回答 3

Stack Overflow用户

发布于 2018-04-03 06:40:49

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

让我们设置一些具有x值的环境。

代码语言:javascript
复制
x <- 0
a <- new.env(); a$x <- 5
b <- new.env(); b$x <- 10

以及使用环境中的x的函数foo

代码语言:javascript
复制
foo <- function(a) {
    a + x
}
foo(1)
# [1] 1

现在我们可以编写一个帮助器函数,可以用来在任何环境下调用函数。

代码语言:javascript
复制
with_env <- function(f, e=parent.frame()) {
    stopifnot(is.function(f))
    environment(f) <- e
    f
}

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

代码语言:javascript
复制
with_env(foo, a)(1)
# [1] 6
with_env(foo, b)(1)
# [1] 11
foo(1)
# [1] 1
票数 11
EN

Stack Overflow用户

发布于 2018-04-02 04:30:37

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

考虑一下代码

代码语言:javascript
复制
new_counter <- function() {
  i <- 0
  function() {
    i <<- i + 1
    i
  }
}

(更新以提高准确性)外部函数创建一个环境,该环境另存为变量。调用这个变量(一个函数)可以有效地调用内部函数,从而更新与外部函数关联的环境。(我不想直接复制Wickham关于这方面的整个部分,但我强烈建议任何感兴趣的人阅读标题为“可变状态”的部分。我想你可以比这更有想象力。例如,下面是一个带有重置选项的修改:

代码语言:javascript
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2018-03-30 06:05:34

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

代码语言:javascript
复制
e <- new.env()
e$a <- TRUE
testFun <- function(){
  print(a)
}
testFun()

结果:打印错误(A):找不到对象'a‘

代码语言:javascript
复制
testFun2 <- function(){
  e$a <- !(a) 
  print(a)
}
environment(testFun2) <- e
testFun2()

返回: FALSE

代码语言:javascript
复制
e$a 

返回: FALSE

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12279076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档