2013-03-27 3 views
13

[.data.tableコールのjスロットに入れる式を作成している間に、.SDの内容で調べて遊ぶことができると便利なことがよくあります。[.data.table()内のブラウザから.SDを表示できますか?

この素朴な試みがうまくいかない...

library(data.table) 
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 

DT[, browser(), by=x] 
# Called from: `[.data.table`(DT, , browser(), by = x) 
Browse[1]> 
Browse[1]> .SD 
# NULL data.table 

... .SDと現在のdata.tableサブセットに関連するいくつかの他の人をという名前の変数は、ローカル環境内のすべての存在していても

.Iを使用して
Browse[1]> ls(all.names = TRUE) 
# [1] ".BY"  ".GRP"  ".I"  ".iSD"  ".N"  ".SD"  
# [7] "Cfastmean" "mean"  "print"  "x"   
Browse[1]> .N 
# [1] 3 
Browse[1]> .I 
# [1] 4 5 6 

、私は+/- .SDのようなものを見ることができますが、その値を直接アクセスできるようにするとよいでしょう:

Browse[1]> DT[.I] 
# x y v 
# 1: b 1 4 
# 2: b 3 5 
# 3: b 6 6 

私の質問は:なぜbrowser()コール内から直接利用できません.SDの期待値は(.I.N.GRP.BYがありながら)ですか? .SDの値にアクセスする別の方法はありますか?

+2

私は勝ちましたder、 'browser()'が呼び出されたとき、 '.SD'に実際に何かが設定されていますか? 'str(.SD)'は 'クラス 'data.table'と 'data.frame'を示します:\t 0 obs。 0変数など –

+0

@ GavinSimpson - あなたはおそらくそこに何かあると思います。私が追加した部分的な答えは、その方向の追加の証拠のように思えます。 '.SD'の遅延評価が何らかの形で関与しているかどうかも疑問です。 –

答えて

14

はマシューDowleのコメントに照らして、更新:

それは明示的にすべての.SDを参照しないものを含む、.SDは、内部的に、すべてj式が評価される環境であることが判明します。 DTのサブセットごとにDTの列をすべて入力しても、それほど時間がかかりません。[.data.table()は本当に必要でない限りそうしません。

代わりに、Rの遅延評価の引数を活用して、評価されていないj式をプレビューし、その中で参照される列を.SDだけ追加します。 .SDが記載されている場合は、DTの列がすべて追加されます。

.SDを表示するには、jの-expressionに参照を入れてください。ここで働く多くの表現の一つである:

library(data.table) 
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 

## This works 
DT[, if(nrow(.SD)) browser(), by=x] 
# Called from: `[.data.table`(DT, , if (nrow(.SD)) browser(), by = x) 
Browse[1]> .SD 
# y v 
# 1: 1 1 
# 2: 3 2 
# 3: 6 3 

そして、ここではカップルより以下のとおりです。

DT[,{.SD; browser()}, by=x] 
DT[,{browser(); .SD}, by=x] ## Notice that order doesn't matter 

.SDがちょうどj - 式によって必要な列をロードすることを自分の目で確かめてくださいするには、それぞれこれらを実行します今度は(ブラウザ環境に入るとき.SDを入力し、それを残し、通常のコマンドラインに戻るにはQ):

DT[, {.N * y ; browser()}, by=x] 
DT[, {v^2 ; browser()}, by=x] 
DT[, {y*v ; browser()}, by=x] 
+1

FWIW、DT [、{。SD; browser()}、by = x] 'も動作します。 –

+0

[データのセクション2.1。テーブル 'FAQ](http://datatable.r-forge.r-project.org/datatable-faq.pdf)は、' .SD'を使用することが許される巨大なスローダウンを指します。 –

+0

ジョシュ、本当に。 FAQのセクション2.1では、 '.SD'を使うことを推奨していますが、' with = FALSE'では*ではありません。 ** ** SDオブジェクトは、内部的に効率的に実装され、引数を関数に渡すより効率的です。 DT [、.SD [、 "sales"、= FALSE]、by = grp] ** ** **このようにしないでください。 – Arun

関連する問題