4

eval我在data.tableR 中使用表达式时遇到了一些麻烦。这是一些代码:

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.table检测j是表单的表达式时,分配发生`:=`(...),然后设置所有内容以调用 C 代码。当你expr用括号括起来时,你正在制作表达式的第一部分{而不是:=,它通过上述检测并最终导致对:=with argumentsc和的评估d

我想这导致了一个问题,为什么你需要把它附在里面{ }

于 2013-01-26T22:50:48.743 回答
5

在 v1.8.11 中已经实现了问题 #376以捕获{周围。:=来自新闻

o 现在实施 FR #2496 以捕获和移除{周围:=j获得所需的结果。现在,DT[,{`:=`(...)}]两者DT[, {`:=`(...)}, by=(...)]都按预期工作,但带有警告。感谢 Alex 报告 SO:R 中 data.table := 的表达式语法

于 2013-11-08T14:26:29.910 回答