将本地分配给本地不存在但全局存在的变量时丢失错误

时间:2016-09-21 15:32:20

标签: r shiny global-variables

对于一个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

1 个答案:

答案 0 :(得分:2)

这不是错误,而是预期的行为。

R language definition说:

  

3.4.4子集分配

     

对结构子集的赋值是一般情况的特例   复杂分配的机制:

x[3:5] <- 13:15
     

此命令的结果就好像执行了以下操作

`*tmp*` <- x
x <- "[<-"(`*tmp*`, 3:5, value=13:15)
rm(`*tmp*`)

因此,在第一步中,将全局列表bbb的副本制作为局部变量*tmp*。然后,发生子集赋值,并将结果分配给(新)局部变量bbb,该函数在函数返回后丢失。

PS:副作用很差,应该避免。不要使用全局变量。函数应作为参数传递输入并返回所有输出(绘图和文件除外)。