4

Reval内で式を操作するのに問題があります。data.tableここにいくつかのコードがあります:

dtb = data.table(a=1:100, b=100:1, id=1:10)
dtb[,`:=`(c=a+b, d=a/b),by=id] #this works fine
expr = expression({`:=`(c=a+b, d=a/b)}) #try to couch everything in an expression
dtb[,eval(expr),by=id] #this does not work
Error in `:=`(c = a + b, d = a/b) : 
   unused argument(s) (c = a + b, d = a/b)

expr = expression(`:=`(c=a+b, d=a/b)) #this works fine
dtb[,eval(expr),by=id] 

なぜ{}これを壊すのですか?

4

2 に答える 2

7

の定義を参照してください:=

function (LHS, RHS) 
stop(":= is defined for use in j only, and (currently) only once; i.e., DT[i,col:=1L] and DT[,newcol:=sum(colB),by=colA] are ok, but not DT[i,col]:=1L, not DT[i]$col:=1L and not DT[,{newcol1:=1L;newcol2:=2L}]. Please see help(\":=\"). Check is.data.table(DT) is TRUE.")

列の割り当ては、の呼び出し内では発生しません:=-- 関数自体は、エラーを生成する以外に何もしません。代入は、[.data.tabledetectjがフォームの式であり`:=`(...)、C コードの呼び出し用にすべてを設定するときに発生します。expr角かっこで囲むと、 の{代わりに式の最初の部分を作成し、上記の検出を通過し、最終的にwith 引数および:=の評価になります。:=cd

それが疑問につながると思いますが、なぜそれを で囲む必要があるの{ }ですか?

于 2013-01-26T22:50:48.743 に答える
5

{アラウンドをトラップするための問題 #376:=が v1.8.11 で実装されました。NEWSより

o FR #2496 が実装され、{周囲:=をトラップして削除し、j目的の結果が得られるようになりました。現在、DT[,{`:=`(...)}]両方DT[, {`:=`(...)}, by=(...)]とも意図したとおりに機能しますが、警告が表示されます。SO: expression syntax for data.table := in Rについて報告してくれた Alex に感謝します

于 2013-11-08T14:26:29.910 に答える