对于一个Shiny项目,我正在使用全局变量。我经常犯错误使用< - 我应该使用的地方<< - 。但令人抓狂的是,当尝试分配一个不存在的局部变量时,如果该变量确实存在于全局环境中,则R不会抛出错误。
这是一个错误还是有一些原因这里的bbb $ bbb赋值不会像ccc $ ccc赋值那样抛出错误?
aaa <- list(aaa="old")
bbb <- list(bbb="old")
f = function(x){
aaa$aaa <<- x
bbb$bbb <- x
ccc$ccc <- x
}
f("new")
#Error in ccc$ccc <- x : object 'ccc' not found
aaa
#$aaa
#[1] "new"
bbb
#$bbb
#[1] "old"
ccc
#Error: object 'ccc' not found
答案 0 :(得分:2)
这不是错误,而是预期的行为。
3.4.4子集分配
对结构子集的赋值是一般情况的特例 复杂分配的机制:
x[3:5] <- 13:15
此命令的结果就好像执行了以下操作
`*tmp*` <- x x <- "[<-"(`*tmp*`, 3:5, value=13:15) rm(`*tmp*`)
因此,在第一步中,将全局列表bbb
的副本制作为局部变量*tmp*
。然后,发生子集赋值,并将结果分配给(新)局部变量bbb
,该函数在函数返回后丢失。
PS:副作用很差,应该避免。不要使用全局变量。函数应作为参数传递输入并返回所有输出(绘图和文件除外)。