我正在尝试在r中使用:=运算符来分配一个变量,该变量的名称由我在函数中提供。
为了在分配多个变量时保持代码可读性,我想使用:=
(paste0(“ var”,i)= 3)构造。但是它的行为似乎与paste0(“ var”,i):= 3构造不同。
这是:=的预期行为,还是我错过了什么?
我可以做些什么来使:=
构造正常工作吗?
示例:
dt<-data.table(var1=1:10)
#This works fine:
dt[,paste0("var",1):=3]
#But this throws an error:
dt[,`:=`(paste0("var",1)=3)]
Error: unexpected '=' in "dt[,`:=`(paste0("var",1)="
答案 0 :(得分:3)
这实际上不是一个data.table
问题,而是一个R问题:
list(paste0('var', 1) = 3)
错误:“ list(paste0('var',1)=”
中出现意外的'='
要构建这样的名称,请使用:=
作为中缀运算符:
dt[ , paste0('var', 1) := 3]
答案 1 :(得分:1)
我认为有3种方法可以解决这个问题。前两种方式来自help(":=")
1)LHS:= RHS表格
# DT[i, LHS := RHS, by = \dots]
# DT[i, c("LHS1", "LHS2") := list(RHS1, RHS2), by = \dots]
2)功能形式
# DT[i, `:=`(LHS1 = RHS1,
# LHS2 = RHS2,
# \dots), by = \dots]
这里LHS
可以等同于字符向量,但是LHS1
和LHS2
已经是单长度字符。
3)第三种方式将:=
视为二进制运算符函数,因此dt[,
:= (paste0("var",1), 3)]
也可以工作。
在R中,您不能使用要即时评估的参数名称来调用函数(无需研究非标准评估)。例如,
f <- function(x1) x1
f(paste0("x", 1)=3)
错误:“ f(paste0(“ x”,1)=“
中出现意外的'='
处理OP评论的示例:
dt[, c(paste0("var", 1), "var2") := .(1, 2)]
dt[, `:=`(var3=3, var4=4)]
val <- c(var5=5, var6=6)
for (x in paste0("var", 5:6))
set(dt, j=x, value=val[x])