【问题标题】:lexical scope in RR中的词法范围
【发布时间】:2013-12-13 17:40:03
【问题描述】:

我最近了解到 R 有可用的词法和动态范围,但它默认使用词法范围。下一个案例真的让我很困惑:

> x <- 1
> f <- function(y) { x + y }
> f(5)  # we expect 6    
[1] 6
> x <- 10
> f(5)  # shouldn't we again expect 6?
[1] 15

不应该使用定义而不是调用的环境评估f吗?这个词法范围如何?谢谢!

【问题讨论】:

    标签: r lexical-scope


    【解决方案1】:
    f <- function(y) { x + y }
    

    是在全局环境中定义的,因此对于未在函数本身中定义的部分(即x),R 会在全局环境中查找它们。

    a=1
    b=2
    f<-function(x)
    {
      a*x + b
    }
    g<-function(x)
    {
      a=2
      b=1
      f(x)
    }
    # compare f(2) and g(2)
    

    上面的这个例子来自here,并给出了很好的讨论。重点是,g() 中的f() 忽略了g() 中的ab 的定义。


    来自wiki on "Scope"

    在面向对象编程中,动态分派在运行时选择对象方法,但实际名称绑定是在编译时完成还是在运行时完成取决于语言。

    【讨论】:

    • 是的,我得到了那部分,但它不应该也使用当时定义的环境吗?我编辑了我的问题以使那部分更清楚。
    • 我不知道为什么应该这样做,因为它会在每次调用时重新检查环境。请记住 R 的开发考虑了交互式编程方法。
    • 那么,使用环境当时你在哪里定义不是词法范围定义的一部分?或者这根本不是 R 使用的词法范围?
    • 不,我认为您是正确的,词法范围可能意味着使用定义时的时间。我想我的意思是 r 只是使用位置,因此在这方面不是动态的
    • 这个讨论很有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多