2015-10-07 20 views
27

我想在函数内修改data.table。如果在功能中使用:=功能,则只会为第二个呼叫打印结果。从函数返回后不打印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 

你能解释一下为什么出现这种情况,如何预防呢?

+4

阅读:https://github.com/Rdatatable/data.table/blob/master /NEWS.md#bug-fixes-3。第1.9版中修复的第一个BUG。6 –

+0

请参阅'data.table'常见问题的2.23节('vignette(“datatable-faq”,package =“data.table”)') – Uwe

回答

29

由于David Arenburg提到comment,答案可以找到here。在版本1.9.6中修复了一个错误,但修复引入了这个缺点。

应该在函数结束时调用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 
+5

只有当data.table的打印被抑制时才需要'DT []' ,所以当使用':='或'set *'函数 – jangorecki

0

对不起,如果我不应该张贴在这里的东西,这不是一个 答案,但我的文章太长了评论。

我想指出,加入 (使用data.table 1.9.6或1.10.4时甚至 )为我做下面尾随[]dt并不总是产生预期的结果的那janosdivenyi的解决方案。

以下实施例显示,如果dt是在函数 一个得到没有 尾随[]的存在所期望的行为的最后一行,但如果dt是未在所述功能的最后一行然后 尾随[]需要获得所需的行为。

第一个例子说明,在dt没有尾随[]我们得到的 预期的行为时dt是在功能上

mydt <- data.table(x = 1:3, y = 5:7) 

myfunction <- function(dt) { 
    df <- 1 
    dt[, z := y - x] 
} 

myfunction(mydt) # Nothing printed as expected 

mydt # Content printed as desired 
## x y z 
## 1: 1 5 4 
## 2: 2 6 4 
## 3: 3 7 4 

添加尾随[]dt给人意外行为的最后一行

mydt <- data.table(x = 1:3, y = 5:7) 

myfunction <- function(dt) { 
    df <- 1 
    dt[, z := y - x][] 
} 

myfunction(mydt) # Content printed unexpectedly 
## x y z 
## 1: 1 5 4 
## 2: 2 6 4 
## 3: 3 7 4 

mydt # Content printed as desired 
## x y z 
## 1: 1 5 4 
## 2: 2 6 4 
## 3: 3 7 4 

移动df <- 1到dt后没有尾随[]给出了非爆炸泰德 行为

mydt <- data.table(x = 1:3, y = 5:7) 

myfunction <- function(dt) { 
    dt[, z := y - x] 
    df <- 1 
} 

myfunction(mydt) # Nothing printed as expected 

mydt # Nothing printed unexpectedly 

的DT后移动df <- 1拖得[]给出的预期 行为

mydt <- data.table(x = 1:3, y = 5:7) 

myfunction <- function(dt) { 
    dt[, z := y - x][] 
    df <- 1 
} 

myfunction(mydt) # Nothing printed as expected 

mydt # Content printed as desired 
## x y z 
## 1: 1 5 4 
## 2: 2 6 4 
## 3: 3 7 4 
+1

时,我认为你对函数的工作方式有些困惑。所有函数都返回一个值。如果你不写一个显式的'return(x)'语句,那么返回函数中的最后一个值。 'df < - 1'无形地返回值'1',而'DT [,x:= y] []'返回'DT',打印出来。 – Frank

+1

感谢您的解释。我没有意识到。我猜这就是我无法回避的“回归”。我也被数据表的“引用复制”方面所困惑。我花了很多年玩这些例子试图理解它们。你现在明白了为什么我不在这个论坛上回答问题:-) – Paul