2015-10-07 8 views
27

data.tableを関数内で修正したいと思います。関数内で:=機能を使用すると、結果は2番目の呼び出しでのみ印刷されます。次の図で関数から返された後にdata.tableオブジェクトが出力されない

ルック:

私は唯一の関数を呼び出す
library(data.table) 
mydt <- data.table(x = 1:3, y = 5:7) 

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

、テーブルには、標準的な動作である(印刷されていないしかし、私は新しいオブジェクトに返さdata.tableを保存した場合。 、それが唯一の1秒間、最初の呼び出しで印刷されていません。

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。 v1.9で修正された最初のBUG。6 –

+0

'data.table' FAQ(' vignette( "datatable-faq"、package = "data.table") ')のセクション2.23を参照してください。 – Uwe

答えて

29

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

' DT [] 'は、data.tableの印刷が抑止されている場合にのみ必要ですので、 ':='や 'set *'関数を使うときは – jangorecki

0

私は 答えではないのですが、私のポストはコメントのために長すぎるここで何かを掲示することになっていないよ場合はごめんなさい。

私は以下のように行うdt[]末尾 を追加するjanosdivenyiのソリューションは、常に期待される結果(でも data.table 1.9.6または1.10.4を使用して)与えないことを指摘したいと思います。次いで

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 

をdtの後に移動させて、末尾に[]を指定すると、unexpecテッド 行動末尾[]と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 # Nothing printed unexpectedly 

が期待 行動

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

関連する問題