了解R中的变量范围

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)

Jus*_*tin 5

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是该函数看起来的范围之外funcloco,当它发现它,它带来了进入当地的范围func和分配给loco在本地范围,而不是poco范围.

希望有所帮助!


Ali*_*Ali 5

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,如果您有多个嵌套函数定义,则只是在父函数中修改值,而不是全局修改.