【问题标题】:Variable scope or parent environment可变范围或父环境
【发布时间】:2017-04-20 01:38:57
【问题描述】:

考虑具有以下功能的功能:

f1=function(){
 f3=function() print(a)
 f2=function() {
   print(a)
   a=3
   f3()}
 print(a)
 a=2
 f2()

a=1
f1()
[1] 1
[1] 2
[1] 2

为什么f2() 考虑f1() 其父环境,而f3() 不考虑f2() 其父环境?我希望f3() 打印3,设置为f2(),而不是2
如果在f2()里面定义了一个变量,f3()找不到它:

f1=function(){
 f3=function() print(b)
 f2=function() {
   print(a)
   b=3
   f3()}
 print(a)
 a=2
 f2()

a=1
f1()
[1] 1
[1] 2
Error in print(b) : object 'b' not found 

【问题讨论】:

    标签: r scope


    【解决方案1】:

    为什么f2() 认为f1() 是它的父环境

    因为它是在f1内部定义的。

    f3() 不考虑f2() 其父环境?

    因为它没有在f2内部定义。

    你需要区分包含环境和父框架f2 是您调用中f3父框架。但是f1 无论如何都是它的包含环境。

    另请参阅 What is the difference between parent.frame() and parent.env() in R; how do they differ in call by reference?Hadley’s introduction into environments

    【讨论】:

    • Tks,@Konrad。有没有办法调用f3() 设置f2() 作为它的parent.environment?
    • 我试图将框架指定为环境但没有成功。
    • @xm1 不是,不是。你可以在f2 里面写environment(f3) = environment()。但是,这将在f2 内创建f3一个新副本。有关更多详细信息,了解您实际想要完成的工作会很有帮助。
    • 正如 Hadley 的网站中所说,R 没有动态范围。再次感谢。我解决了做正确的事情:传递参数。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2019-12-15
    • 2021-09-26
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多