在函数中修改后,第一次调用时不显示data.table

Vas*_*y A 2 r 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
Run Code Online (Sandbox Code Playgroud)

它只发生在我的函数返回一个值(无关紧要,由return()或通过invisible())时,并且仅在表内容被修改时(例如,如果不是删除列我更改列名称 - 不会发生此效果).这种行为对我来说并没有带来任何问题,但我仍然很好奇为什么会这样.

Hel*_*123 9

如果您使用的是v1.9.6,请参阅相应的自述文件(第2个错误修正,第1个条目,https://github.com/Rdatatable/data.table):

if(TRUE)DT [,LHS:= RHS]不再打印,#869和#1122.测试补充说.为了实现这一点,我们不得不忍受一个缺点:如果a:=在函数结束之前没有DT []的函数内使用,那么下一次DT或print(DT)在函数结束时输入提示,什么都不打印.将打印重复的DT或打印(DT).为避免这种情况:在函数中包括最后一个:=后的DT [].如果那是不可能的(例如,它不是一个你可以改变的功能),那么保证在提示下打印DT [].和以前一样,在:= query的末尾添加一个额外的[]是一个推荐的更新然后再打印的习惯用法; 例如> DT [,foo:= 3L] [].感谢Jureiss和Jan Gorecki的报道.

因此:DT[]在函数调用后调用有帮助吗?