万千封印
两种编程方式选择变量:with = FALSE:DT = data.table(col1 = 1:3)colname = "col1"DT[, colname, with = FALSE] # col1# 1: 1# 2: 2# 3: 3“点”(..)前缀:DT[, ..colname] # col1# 1: 1# 2: 2# 3: 3关于“点”的进一步描述(..)符号,见1.10.2中的新特点(目前没有在帮助文本中描述)。到指派若要变量,请将:=括号内:DT[, (colname) := 4:6] # col1# 1: 4# 2: 5# 3: 6后者称为列。普朗克,因为您将整个列向量替换为引用。如果子集i在这里,它将以参考的方式签署。亲生(colname)是在2014年10月cran版1.9.4版中引入的速记。这是新闻项目:使用with = FALSE带着:=现在所有情况下都不推荐使用,因为将lhs包装在:=使用括号已经有一段时间了。colVar = "col1"DT[, colVar := 1, with = FALSE] # deprecated, still works silentlyDT[, (colVar) := 1] # please change to thisDT[, c("col1", "col2") := 1] # no changeDT[, 2:4 := 1] # no changeDT[, c("col1","col2") := list(sum(a), mean(b)] # no changeDT[, `:=`(...), by = ...] # no change另见细节分节?`:=`:DT[i, (colnamevector) := value]# [...] The parens are enough to stop the LHS being a symbol为了在评论中回答更多的问题,这里有一个方法(和往常一样,有很多种方法):DT[, colname := cumsum(get(colname)), with = FALSE]# col1# 1: 4# 2: 9# 3: 15或者,您可能会发现更容易读、写和调试eval a paste,类似于构造要发送到服务器的动态SQL语句:expr = paste0("DT[,",colname,":=cumsum(",colname,")]")expr# [1] "DT[,col1:=cumsum(col1)]"eval(parse(text=expr))# col1# 1: 4# 2: 13# 3: 28如果经常这样做,就可以定义一个助手函数。EVAL :EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))EVAL("DT[,",colname,":=cumsum(",colname,")]")# col1# 1: 4# 2: 17# 3: 45现在data.table1.8.2自动优化j为了提高效率,最好使用eval方法。这个get()在……里面j防止某些优化,例如。或者,有set()..低开销,功能形式:=在这里会很好。看见?set.set(DT, j = colname, value = cumsum(DT[[colname]]))DT# col1# 1: 4# 2: 21# 3: 66