在下面的函数中,我以某个地方为例,m
首先使用常规赋值运算符将变量定义为NULL <-
。
稍后,在函数中set()
,使用第5行中的新赋值运算符将其m
初始化。这将导致它成为具有value的全局变量。NULL
<<-
m
NULL
我不明白为什么我们必须在第2行中也首先使用常规的赋值运算符对其进行定义。
makeVector <- function(x = numeric()) {
m <- NULL
set <- function(y) {
x <<- y
m <<- NULL
}
get <- function() x
setmean <- function(mean) m <<- mean
getmean <- function() m
list(set = set, get = get,
setmean = setmean,
getmean = getmean)
}
如果不定义m
,它将在全局环境而不是函数中创建。从?"<<-"
运算符“ <<-”和“->>”通常仅在函数中使用,并导致在父环境中搜索要分配的变量的现有定义。如果找到了这样的变量(并且其绑定未锁定),那么将重新定义其值,否则将在全局环境中进行赋值。请注意,它们的语义与S语言中的语义不同,但是与R的作用域规则结合使用时会很有用。有关更多详细信息和示例,请参见“ R语言定义”手册。
这是一个小的示例,首先说明了m
in的预定义,f
因此in中g
定义的in变量被f
写入时in被更改,而in中的变量未在任何地方预定义,因此将其设置在全局环境中。m
m
f
f2
m
# Case 1. m is predefined in f
if (exists("m")) rm(m)
f <- function() {
m <- 0
g <- function() m <<- 1
g()
m
}
f()
## [1] 1
exists("m")
## [1] FALSE
# Case 2. m is not predefined
f2 <- function() {
g <- function() m <<- 1
g()
m
}
f2()
## [1] 1
m # m defined in global environment
## [1] 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句