2016-09-21 20 views
0

對於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 

回答

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:副作用不好,應該避免。不要使用全局變量。函數應該作爲參數傳遞並返回所有輸出(除了圖和文件)。

+0

所以你說ccc $ ccc錯誤是由'* temp *'< - x引發的;但對於bbb $ bbb這不是一個錯誤,因爲它是在全球環境中找到的? – 3D0G

+0

在Shiny中,當用戶在網頁上輸入一些數據時,我在server()函數內的observeEvent()函數內部獲得控件。由於我想保存數據,因此實際上別無選擇,只能將其分配給全局,然後將全局保存爲文件。當observeEvent()返回它返回到server()並且我失去控制時,所以無處可返回(the_data)。 – 3D0G

+0

是的第一條評論。我不使用光澤,但我懷疑它需要糟糕的編程習慣。 – Roland