我正在阅读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()
。不是吗?
我很感激任何评论和指导。
答案 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的输出。