我想在一个函数中修改一个data.table
。如果我在函数中使用:=
特性,则只为第二次调用打印结果。
请看下面的插图:
library(data.table)
mydt <- data.table(x = 1:3, y = 5:7)
myfunction <- function(dt) {
dt[, z := y - x]
dt
}
当我只调用函数时,表不会被打印(这是标准行为。但是,如果我将返回的data.table
保存到一个新对象中,则在第一次调用时不会打印它,只会在第二次调用时打印。
myfunction(mydt) # nothing is printed
result <- myfunction(mydt)
result # nothing is printed
result # for the second time, the result is printed
mydt
# x y z
# 1: 1 5 4
# 2: 2 6 4
# 3: 3 7 4
你能解释一下为什么会发生这种情况以及如何预防吗?
2条答案
按热度按时间fdbelqdn1#
在版本1.9.6中修复了一个错误,该错误引入了此缺点(请参阅新闻1.9.6,错误修复#1)。
应该在函数结束时调用
DT[]
来防止这种行为。这在
data.table
FAQ 2.23中有描述:为什么使用
:=
将结果打印到控制台后,有时需要输入两次DT
?这是让#869工作的一个不幸的缺点。如果
:=
在函数内使用,而在函数结束之前没有DT[]
,则下次在提示符下键入DT
时,将不会打印任何内容。将打印重复的DT
。要避免这种情况:在函数中的最后一个:=
之后包含DT[]
。如果这是不可能的(例如,它不是一个你可以改变的函数),那么print(DT)
和DT[]
在提示符下保证打印。和前面一样,在:=
查询的末尾添加一个额外的[]
是一个推荐的更新然后打印的习惯用法;例如>DT[,foo:=3L][]
。nvbavucw2#
我很抱歉,如果我不应该在这里张贴的东西,这不是一个答案,但我的职位是太长的评论。
我想指出的是,janosdivenyi在
dt
后面加上一个尾随[]
的解决方案并不总是给予预期的结果(即使在使用data.table 1.9.6或1.10.4时)。下面的例子表明,如果
dt
是函数中的最后一行,则在不存在尾随[]
的情况下获得所需的行为,但是如果dt
不在函数中的最后一行,则需要尾随[]
来获得所需的行为。第一个例子显示,如果
dt
上没有尾随的[]
,则当dt
位于函数的最后一行时,我们将获得预期的行为在
dt
上添加尾随[]
会出现意外行为将
df <- 1
移动到dt之后,而不使用尾随[]
,会产生意外行为将
df <- 1
移动到dt之后,并尾随[]
,即可获得预期的行为