关于data.table中with参数使用的困惑及相关问题咨询
data.table中
with参数的常见困惑与解答 先看几个涉及with参数的代码示例:
library("data.table") iris1 = as.data.table(iris) #case - 0 iris1[ , grep("Petal", names(iris1)) ] #case - 1 iris1[ , grep("Petal", names(iris1)) , with=FALSE ] # Correct #case - 2 # Error in [<-data.table(*tmp*, , grep("Petal", names(iris1)), with = FALSE, : unused argument (with = FALSE) iris1[ , grep("Petal", names(iris1)) , with=FALSE ] = 5 # Wrong #case - 3 iris1[ , grep("Petal", names(iris1)) ] = 5 # Correct
问题1:为何Case-2中使用with参数会报错?
data.table的**取子集操作(DT[...])和赋值子集操作(DT[...] = value)**调用的是两个完全不同的函数:前者是[.data.table,后者是[<-.data.table。with是[.data.table特有的参数,用来控制是否把列名当作变量引用;而[<-.data.table根本没有with这个参数,传入该参数自然会触发“未使用的参数”错误。
问题2:Case-3未使用with参数时,如何区分变量名和列名?
赋值场景的逻辑和取子集完全不同:DT[, cols] = value中,逗号后的表达式会先被完整计算(比如这里grep得到列位置c(3,4)),然后直接把结果当作**列的索引(位置或名称)**定位目标列,不会尝试将其解析为列变量。也就是说赋值操作默认就是“索引模式”,不需要with参数切换,自然不存在变量名和列名混淆的问题。
问题3:Case-0为何未报错?它并未匹配列名或函数,为何只返回选中的列序号?
你误解了Case-0的输出:grep("Petal", names(iris1))会先计算得到向量c(3,4),而data.table的取子集函数[.data.table在遇到数字向量时,不管有没有with=FALSE,都会把它当作列的位置索引处理,直接返回对应位置的列数据(即Petal.Length和Petal.Width列),而非返回列序号。你看到的“列序号”是表达式计算的中间结果,最终用来定位列,所以代码不会报错,还能返回正确的列。
内容的提问来源于stack exchange,提问作者explorer
相关产品推荐
相关产品推荐

