data.tableは:=演算子を導入しました。なぜオーバーロードしないのですか<-?
2 に答える
<-
「過負荷」になる可能性のある場所が 2 つあります。
x[i, j] <- value # 1
x[i, {colname <- value}] # 2
最初のものは の全体をx
にコピーし*tmp*
、その作業コピーを変更して、 に代入しx
ます。これは、r-devel here で最近議論された R のこと (src/main/eval.c および subassign.c)です。R を変更してパッケージを許可するか、R 自体を変更して へのコピーを回避できるように思えまし*tmp*
たが、現在のところ IIUC はできません。
2つ目は、オーウェンの答えが言及しているものだと思います。そのような中で参照による割り当てを行っても問題ないと認める場合j
、どの演算子ですか? Owen's answer へのコメントによる<-
と、 の<<-
ユーザーによって既に使用されているj
ため、:=
.
[<-
の全体をコピーしなかったとしてもx
、それでも好きな:=
ので、次のj
ようなことができます:
DT[,{newcol1:=sum(a)
newcol2:=a/newcol1}, by=group]
テーブルへの参照によって新しい列が追加され、:=
各グループ内で各列の RHS が評価されます。(:= within group を実装した場合)
2012 年 10 月の更新
1.8.2 (2012 年 7 月の CRAN) の時点で、単一の列を追加または更新するために:=
グループごとに実装されました。すなわち、 の単一の LHS です:=
。そして現在、v1.8.3 (執筆時点では R-Forge 上) では、グループごとに複数の列を追加できます。例えば、
DT[, c("newcol1","newcol2") := .(sum(a),sum(b)), by=group]
または、おそらくもっとエレガントに:
DT[,`:=`(newcol1=sum(a),
newcol2=sum(b)), by=group]
しかし、2 番目の式が最初の式の結果を使用できるという、しばらく想定されていた反復多重 RHS はまだ実装されていません ( FR#1492 )。したがって、これでもエラーが発生"newcol1 not found"
するため、次の 2 つの手順で実行する必要があります。
DT[,`:=`(newcol1=sum(a),
newcol2=a/newcol1), by=group]
次の理由により、これが必要な技術的な理由はないと思います::=
は内部でのみ使用される[...]
ため、常に引用されます。[...]
式ツリーを調べて、そこにあるかどうかを確認:=
します。
つまり、実際にはオペレーターとして機能しておらず、オーバーロードされていません。そのため、彼らは希望するほぼすべてのオペレーターを選択できました。たぶん、見た目が良くなったと思いますか?または、明らかにそうではないため、混乱が少なくなり<-
ますか?
(実際には をオーバーロードできないため、その外でif:=
を使用することはできないことに注意してください。左側の引数を評価しないため、型が何であるかはわかりません)。[...]
<-
<-
<-