FUD*_*FUD 2 environment scope r environment-variables
如何在以下代码段中修改vairable'loco'的值:
poco <- function() {
func <- function(x) {
print(loco)
loco <- loco+x
}
loco <- 123
func(1)
func(2)
}
Run Code Online (Sandbox Code Playgroud)
此函数给出以下结果:
> poco()
[1] 123
[1] 123
Run Code Online (Sandbox Code Playgroud)
poco <- function() {
func <- function(x) {
print(loco)
loco <<- loco+x
}
loco <- 123
func(1)
func(2)
}
Run Code Online (Sandbox Code Playgroud)
此<<-
运算符分配给外部范围.(像assign(..., env=...)
).但是,正如评论中所提到的,这通常是一个坏主意.如果您想在第二个问题上进一步提出问题,那么我认为还有其他更好的选择.
<<-
如果你不小心的话,可以把你咬在屁股上.请参阅此Wiki文章
发生了什么事在你的第一个功能,你loco <- loco + x
是该函数看起来的范围之外func
的loco
,当它发现它,它带来了进入当地的范围func
和分配给loco
在本地范围,而不是poco
范围.
希望有所帮助!
R有一堆环境.因此,当您使用simple <-
或=
命令更改函数内的变量时,其值不会在外部环境中更改.
为此,您有几个选项,如下所示:
第一选择:
func <- function(x) {
print(loco)
# To modify value of "loco" just in the parent environment, but not globally
loco <<- loco+x
}
Run Code Online (Sandbox Code Playgroud)
第二(更好)选项:
func <- function(x) {
print(loco)
# Again modifies the varaible just in the parent environment, not globally
assign("loco", loco + x, envir = sys.frame(-1))
}
Run Code Online (Sandbox Code Playgroud)
第三种选择:
func <- function(x) {
print(loco)
# To modify the value of a global variable "loco"
assign("loco", loco + x, envir = .GlobalEnv)
}
Run Code Online (Sandbox Code Playgroud)
那么你将拥有:
loco <- 123
func(1) # 123
func(2) # 124
loco # 126
Run Code Online (Sandbox Code Playgroud)
请注意,通过使用选项1和2,如果您有多个嵌套函数定义,则只是在父函数中修改值,而不是全局修改.