我想在一个函数中修改一个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 

你能解释一下为什么会发生这种情况以及如何预防吗?

推荐答案

正如comment中提到的David Arenburg个,答案可以在here中找到.版本1.9.6中修复了一个bug,但该修复引入了这个缺点.

应该在函数末尾调用DT[]来防止这种行为.

myfunction <- function(dt) {
    dt[, z := y - x][]
}
myfunction(mydt)  # prints immediately
#    x y z
# 1: 1 5 4
# 2: 2 6 4
# 3: 3 7 4 

R相关问答推荐

重复组的运行计数

插入指示行之间时间间隔的新行

过滤Expand.Grid的结果

R -模运算后的加法

以R表示的gglikert地块调整总数

R的GG平行坐标图中的排序变量

带有gplot 2的十字舱口

MCMC和零事件二元逻辑回归

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

如何动态更新selectizeInput?

如何计算多个日期是否在一个日期范围内

使用Facet_WRAP时更改框图中线的 colored颜色

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

使用rvest从多个页面抓取时避免404错误

计算两列中满足特定条件连续行之间的平均值

将箭头绘制在图形外部,而不是图形内部

在使用具有Bray-Curtis相似性的pvCluust时计算p值

在R中,如何从一系列具有索引名的变量快速创建数据帧?

名字的模糊匹配

使用LAG和dplyr执行计算,以便按行和按组迭代