在R

时间:2017-03-23 06:00:22

标签: r global-variables environment

我正在阅读Hadley Wickham的高级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,因为我在y的调用函数h()中创建了一个局部变量g()。不是吗?

我很感激任何评论和指导。

1 个答案:

答案 0 :(得分:0)

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

如果您希望y保留g功能中的值,您可以在y函数中传递h()的值。

更新这两个函数:

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

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

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

f()
#[1] 8

另外,如果您将y功能中的g()更新为

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

<<-的作用是更新全局环境中y的值。因此,之前在全局环境中为10的y的值现在更改为5.因此,当您现在调用f()时,您将获得8而不是13的输出。