【问题标题】:Accessing variables in local environment in R [duplicate]在R中访问本地环境中的变量[重复]
【发布时间】:2017-08-15 13:13:39
【问题描述】:

我正在阅读 Hadley Wickham 的 Advanced R 以更好地理解这门语言。我在环境一章中遇到了一个部分,他谈到了局部变量优于全局变量的偏好。

例如,

h <- function(){
  x<-10
  function(){
    x
  }
}
i<-h()
x<-20
i()

这可能会返回10 而不是20,因为本地x 会覆盖全局x

但是,当我对以下代码应用类似的逻辑时,全局变量 y 会覆盖本地 y

x <- 0
y <- 10
f <- function() {

  x <- 1
  g()
}
g <- function() {
  x <- 2
  y<-5 #Added by me
  h()
}
h <- function() {
  x <- 3
  x + y
}
f()

输出为13。我会期待8,因为我在h() 的调用函数g() 中创建了一个局部变量y。不是吗?

我将不胜感激任何 cmets 和指导。

【问题讨论】:

    标签: r global-variables environment


    【解决方案1】:

    h() 函数被调用时,您将x 分配给该函数本地的3。当它尝试评估x + y 时,它在本地函数中找不到y 的定义,因此,它采用全局声明的y 的值,即10。因此,输出为10 + 3 = 13。 g() 函数中的 y 的值仅对该函数本地,而不是 h() 函数的本地值。所有功能的本地环境各不相同,相互独立。

    如果您希望y 保持其来自g 函数的值,您可以在h() 函数中传递y 的值。

    像这样更新这两个函数:

    g <- function() {
         x <- 2
         y<-5 
         h(y)
    }
    
    h <- function(y) {
        x <- 3
        x + y
    }
    

    所以现在当您调用 f() 函数时,您会得到预期的输出

    f()
    #[1] 8
    

    此外,如果您将g() 函数中的y 更新为

    g <- function() {
          x <- 2
          y <<-5 #Note the <<- operator. 
         h()  
    }
    

    &lt;&lt;- 所做的是更新全局环境中y 的值。所以y在全局环境中的值之前是10现在变成了5。因此,当你现在调用f()时,你会得到8而不是13的输出。

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2023-03-15
      • 1970-01-01
      • 2020-10-18
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多