Ale*_*lex 4 expression eval r data.table
我有一些麻烦的eval内data.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)
为什么包括{}打破这个?
看到的定义:=:
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用括号括起来时,你正在制作表达式的第一部分,{而不是:=通过上述检测,并最终导致:=使用参数c和d.
我想这导致了一个问题,为什么你需要把它括起来{ }?
陷阱{周围的问题#376:=现已在v1.8.11中实现.来自新闻:
O FR#2496现在被实现以捕获并除去
{各处:=中j,以获得期望的结果.现在,DT[,{`:=`(...)}]并DT[, {`:=`(...)}, by=(...)]都作为预期但警告.感谢Alex报告SO:data.table:=在R中的表达式语法
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |