10

同じ変数名を使用するネストされた環境が2つある場合、外部環境の値を取得するにはどうすればよいですか?

これを実装する正しい方法を見つけるのに苦労しています。私はevalのいくつかのバリエーションparent.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、文字値オブジェクトを言語ドメインに渡すことができる膜チャネルの 1 つです。

于 2012-11-30T20:50:30.443 に答える
2

eval への呼び出しでevaltoevalqまたはその他の引用符を変更します。objobj は与えられる前に評価されてevalいるため、内部値を持っているので、引用すると、eval評価される式 (値ではない) を渡します。

于 2012-11-30T20:51:29.823 に答える