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

时间:2015-10-18 07:21:27

标签: 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

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

1 个答案:

答案 0 :(得分:8)

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

  

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

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