10

如果我有两个使用相同变量名的嵌套环境,我将如何获取外部环境的值?

我很难找出实现这一点的正确方法。我尝试了evalparent.frame(x)和内部的一些变体。sys.frame(x)任何建议,将不胜感激。


例子:

outerFunc <- function() { 
  obj <- "Outer Object"
  innerFunc()
}

innerFunc <- function() {
  # A local variable with same name is created
  obj <- "Inner Object"

  # would like to grab the value of obj from the outer environment
  obj.callingFunc <- eval(obj, envir=sys.frame(-1))

  cat(obj.callingFunc)  # gives "Inner Object" instead of "Outer Object"
} 

> outerFunc()
Inner Object

在这种特定情况下,我无法使用明显的解决方案(显式传递obj。使用不同的变量名等)。


编辑

检查下面@GregSnow 和@Dwin 的答案

  # THESE WORK
  eval(quote(obj), envir=parent.frame()) # equivalent to evalq(obj, envir=parent.frame())
  get("obj", envir=parent.frame())

  # THESE DO *NOT* WORK
  eval("obj", envir=parent.frame()) 
  get(quote(obj), envir=parent.frame())

关于引用get()vs的影响有什么想法eval()吗?



4

2 回答 2

10
outerFunc <- function() { 
  obj <- "Outer Object"
  innerFunc()
}

innerFunc <- function() {
  # A local variable with same name is created
  obj <- "Inner Object"

  # would like to grab the value of obj from the outer environment
  cat( get('obj', envir=parent.frame()) )

   } 

 outerFunc()
#Outer Object

也可以使用:eval(quote(obj), envir=sys.frame(-1)). 很明显,quote(expr) 的含义与“expr”的含义不同。该get函数“期望”(或者更准确地说是设计)接收字符值,而eval期望调用和表达式,即“语言”对象。在 R 中,数据和语言之间有一种半透膜,get是一种膜通道,您可以通过它将字符值对象传递到语言域。

于 2012-11-30T20:50:30.443 回答
2

在对 eval 的调用中更改您的evaltoevalq或以其他方式引用obj。因为 obj 在被赋予之前被评估,eval所以它具有内部值,引用它说传递eval要评估的表达式(而不是值)。

于 2012-11-30T20:51:29.823 回答