data中的表达式语法:在R中

Ale*_*lex 4 expression eval r data.table

我有一些麻烦的evaldata.table中的R与表达工作.这是一些代码:

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] 
Run Code Online (Sandbox Code Playgroud)

为什么包括{}打破这个?

use*_*457 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.")
Run Code Online (Sandbox Code Playgroud)

在调用中不会发生列的赋值:=- 除了产生错误之外,函数本身不会执行任何操作.当[.data.tabledetect j是表单的表达式`:=`(...)然后为调用C代码设置所有内容时,就会发生赋值.当你expr用括号括起来时,你正在制作表达式的第一部分,{而不是:=通过上述检测,并最终导致:=使用参数cd.

我想这导致了一个问题,为什么你需要把它括起来{ }


Aru*_*run 5

陷阱{周围的问题#376:=现已在v1.8.11中实现.来自新闻:

O FR#2496现在被实现以捕获并除去{各处:=j,以获得期望的结果.现在,DT[,{`:=`(...)}]DT[, {`:=`(...)}, by=(...)]都作为预期但警告.感谢Alex报告SO:data.table:=在R中的表达式语法