为什么:=运算符在不同的构造上表现不同?

时间:2019-07-24 05:23:52

标签: r syntax data.table operator-keyword

我正在尝试在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)="

2 个答案:

答案 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可以等同于字符向量,但是LHS1LHS2已经是单长度字符。

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])