2015-10-18 68 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