R 中的作用域是如何工作的?
How does scoping work in R?
a <- 10
f <- function(){
a <<- 3
function() {
a <<- 15
a <- 5
return(a)
}
}
g <- f()
g()
a
当我 运行 上述代码时,我得到以下输出:
5
15
谁能解释一下为什么第二个输出是 15 而不是 3?当我在函数 f.
中不使用“<<-”时,相同的代码 returns 10
看看你的功能是什么f
returns.
f()
function() {
a <<- 15
a <- 5
return(a)
}
<environment: 0x000000001f1c7898>
因此,当您将此结果(一个函数)分配给 g
时,它将成为上面输出中的那个函数。当您调用 g
.
时,代码行 a <<- 3
从未 执行
换句话说,第二个输出的解释方式与第一个输出的解释方式相同,g
将 globalenv
中存在的变量 a
设置为 15
和 returns 在其自身环境中创建的变量 a <- 5
的值。
编辑。
请注意,如果像 Dason 在他的评论中所说的那样,在调用 g
之前打印 a
,它的值已更改为 3
,就像您在问题中所期望的那样。调用 f
时确实执行了代码行 a <<- 3
。
g <- f() # call 'f'
a # print 'a', the value has changed
[1] 3
g() # now call 'g'
[1] 5
a # and the value of 'a' changed again
[1] 15
a <- 10
f <- function(){
a <<- 3
function() {
a <<- 15
a <- 5
return(a)
}
}
g <- f()
g()
a
当我 运行 上述代码时,我得到以下输出:
5
15
谁能解释一下为什么第二个输出是 15 而不是 3?当我在函数 f.
中不使用“<<-”时,相同的代码 returns 10看看你的功能是什么f
returns.
f()
function() {
a <<- 15
a <- 5
return(a)
}
<environment: 0x000000001f1c7898>
因此,当您将此结果(一个函数)分配给 g
时,它将成为上面输出中的那个函数。当您调用 g
.
时,代码行 a <<- 3
从未 执行
换句话说,第二个输出的解释方式与第一个输出的解释方式相同,g
将 globalenv
中存在的变量 a
设置为 15
和 returns 在其自身环境中创建的变量 a <- 5
的值。
编辑。
请注意,如果像 Dason 在他的评论中所说的那样,在调用 g
之前打印 a
,它的值已更改为 3
,就像您在问题中所期望的那样。调用 f
时确实执行了代码行 a <<- 3
。
g <- f() # call 'f'
a # print 'a', the value has changed
[1] 3
g() # now call 'g'
[1] 5
a # and the value of 'a' changed again
[1] 15