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.table
detect j
是表单的表达式`:=`(...)
然后为调用C代码设置所有内容时,就会发生赋值.当你expr
用括号括起来时,你正在制作表达式的第一部分,{
而不是:=
通过上述检测,并最终导致:=
使用参数c
和d
.
我想这导致了一个问题,为什么你需要把它括起来{ }
?
陷阱{
周围的问题#376:=
现已在v1.8.11中实现.来自新闻:
O FR#2496现在被实现以捕获并除去
{
各处:=
中j
,以获得期望的结果.现在,DT[,{`:=`(...)}]
并DT[, {`:=`(...)}, by=(...)]
都作为预期但警告.感谢Alex报告SO:data.table:=在R中的表达式语法