我不确定我是否在此处犯了错误(可能使用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
答案 0 :(得分:7)
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
对象,这会导致语法错误。