You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:22:22