R 范围——如果存在同名的局部变量,如何在父环境中计算对象?
如果有两个使用相同变量名的嵌套环境,如何获取外部环境的值 我很难想出正确的方法来实现这一点。我在eval内部尝试了R 范围——如果存在同名的局部变量,如何在父环境中计算对象?,r,environment-variables,R,Environment Variables,如果有两个使用相同变量名的嵌套环境,如何获取外部环境的值 我很难想出正确的方法来实现这一点。我在eval内部尝试了parent.frame(x)和sys.frame(x)的一些变体。如有任何建议,将不胜感激 例如: outerFunc <- function() { obj <- "Outer Object" innerFunc() } innerFunc <- function() { # A local variable with same name is
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
关于在get()
vseval()
中引用的效果,您有什么想法吗
outerFunc将您的eval
更改为evalq
,或者在调用eval时引用obj
。正如obj在被赋予eval
之前被评估一样,它有内部值,引用它说将表达式(而不是值)传递给eval
进行评估。你能解释为什么明显的解决方案不可用吗?感觉上你是在问我们一个关于解决你真正问题的特定方法的问题,而不是告诉我们你真正的问题。“也许还有更好的方法。”Aaron,我希望完成的是学习如何在不同的环境中使用变量。最后我的评论是为了避免提供解决方案的诱惑,这些解决方案提供相同的最终结果,但不提供知识:)上述功能只是为了测试和学习,不代表手头的任何问题。里卡多:我赞扬你的努力。R评估的内部工作是一个很少有人理解的领域(我并不把自己包括在理解它的小组中)。我猜可能有一些人在50到200之间理解得很好。引用:get
以字符串作为输入,eval
接受调用或表达式。向函数提供错误的输入不太可能使其工作。@Ricardosporta,我引用的意思是类似于eval(quote(obj),…
。我应该更具体一些。一如既往地感谢您的详细回答。+1为我指明了语言对象,这有助于澄清quote()的返回值
我认为在评论中使用“调用”环境而不是“外部”环境会有所帮助-您需要区分词法范围(即如何定义函数)和动态范围(如何调用函数)。外部环境有点含糊不清。
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
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