2015-10-18 43 views
1

中被修改後在第一次調用時不顯示,我修改了作爲參數給出的data.table的列。我注意到,如果我再嘗試調用該函數後立即顯示此data.table(我的意思是,僅僅通過它的名字),沒有任何反應,只有後續調用顯示錶:data.table在函數

DT <- data.table(colA=1:4, colB=4:1) # sample table 
modcol <- function(dtIn){ 
dtIn[, colA:=NULL]; 
return(TRUE); 
} 

DT # display table before any changes: 
# colA colB 
#1: 1 4 
#2: 2 3 
#3: 3 2 
#4: 4 1 

modcol(DT) # run our function 
#[1] TRUE 

DT # silent! 
DT # only second call display modified table 
# colB 
#1: 4 
#2: 3 
#3: 2 
#4: 1 

它只發生當我的函數返回一個值(無關緊要時,由return()invisible()),並且僅當表內容被修改時(例如,如果不是刪除列而是更改列名稱 - 這種效果不會發生)。這種行爲並沒有給我帶來任何問題,但我仍然很好奇它爲什麼會發生。

回答

5

如果使用v1.9.6,請參見相應的自述(秒錯誤修正,第一條目,https://github.com/Rdatatable/data.table):

如果(TRUE)DT [,LHS:= RHS]不再版畫,# 869和#1122。添加了測試。爲了實現這個功能,我們不得不忍受一個缺點:如果在函數結束前沒有DT []的函數中使用a:=,那麼下一次在函數結束時輸入DT或print(DT)提示,不會打印任何內容。重複的DT或打印(DT)將打印。爲了避免這種情況:在你的函數中包含最後一個:=後的DT []。如果這是不可能的(例如,它不是你可以改變的功能),那麼在提示符下的DT []保證打印。和以前一樣,在:= query的末尾添加一個額外的[]是更新然後打印的建議成語;例如> DT [,foo:= 3L] []。感謝Jureiss和Jan Gorecki的報告。

因此:函數調用幫助後調用DT[]

+0

你是對的,那是我的情況。我應該更好地查找標記爲重複的帖子。 –

+0

由此造成的其他問題?或者只是它不打印結果? – skan