data.table中i位置用..代词报错,求等效tidyverse!!的解决方案
关于data.table双点代词(..)在i位置的使用问题
问题核心
在data.table v1.14.8中,双点代词..能在j位置正常引用外部变量(如dt[, region := ..reg]),但在i位置执行筛选(dt[ reg == ..reg ])时会报错object '..reg' not found,且已确认数据表为data.table类型、加载顺序保证了[方法的正确调度。
原因解析
..代词初始仅支持在j位置(列选择、列赋值等场景)使用,v1.14.8版本尚未扩展到i位置。在i位置中,data.table会优先在数据表的列空间查找变量,当外部变量名与列名重复时,会直接匹配列,无法通过..突破该作用域限制。
等效解决方案(替代dt |> filter(reg == !!reg))
方法一:用get()指定环境
明确指定从全局环境(或目标环境)获取外部变量:
dt[ reg == get("reg", envir = .GlobalEnv) ]
方法二:用大括号隔离变量作用域
通过大括号创建局部环境,先将外部变量赋值到局部变量再进行比较:
dt[ {reg_ext <- reg; reg == reg_ext} ]
方法三:重命名外部变量(最直观)
避免外部变量名与列名冲突,直接用不同名称引用:
reg_ext <- 7 dt[ reg == reg_ext ]
方法四:升级data.table版本
从data.table v1.15.0开始,..代词正式支持在i位置使用,升级后即可直接运行:
dt[ reg == ..reg ]
官方文档参考
查看?data.table帮助文档中的Scope of variables章节,其中明确说明了..代词的作用域规则,以及不同版本对i位置支持的更新说明。
内容的提问来源于stack exchange,提问作者Macosso
相关产品推荐
相关产品推荐

