无法在data.table [,:=]函数中使用eval(parse(...))

时间:2014-03-13 10:17:59

标签: r data.table

我不确定我是否在此处犯了错误(可能使用eval(parse(...))的危险),但在此我尝试在更新eval(parse(...))列时使用data.table,这会产生错误。以下是我的代码。

require(data.table)
# Loading required package: data.table
# data.table 1.9.2  For help type: help("data.table")
DT<-data.table(x=seq(1,10,1),
               y=seq(2,20,2))
DT[,y:=y*eval(parse(text="1*2"))] #Doesn't work
# Error in y * expression(1 * 2) : non-numeric argument to binary operator
variable <- eval(parse(text="1*2"))
DT[,y:=y*variable] #Works
DT
#     x  y
# 1:  1  4
# 2:  2  8
# 3:  3 12
# 4:  4 16
# 5:  5 20
# 6:  6 24
# 7:  7 28
# 8:  8 32
# 9:  9 36
#10: 10 40

1 个答案:

答案 0 :(得分:7)

此行为bug #5423现已在data.table v1.9.3的当前开发版本的commit#1234中修复。来自NEWS

  

o DT[,y := y * eval(parse(text="1*2"))]导致错误,除非eval()包含了paranthesis。也就是DT[,y := y * (eval(parse(text="1*2")))]。现在修复,关闭#5423。感谢Wet Feet的报道以及Simon O&#; Hanlon发现问题here on SO


无论你为什么要这样做以及相对优点,这都是关于优先顺序的。您需要将整个eval(parse(text="1*2"))包装在一组括号中,以确保在 之前对其进行评估,然后尝试将其乘以y ...

DT[,y:=y*(eval(parse(text="1*2")))] 
#     x  y
# 1:  1  4
# 2:  2  8
# 3:  3 12
# 4:  4 16
# 5:  5 20
# 6:  6 24
# 7:  7 28
# 8:  8 32
# 9:  9 36
#10: 10 40

没有括号data.table::":="正试图将y乘以expression对象,这会导致语法错误。