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

R data.table中使用paste0时get(x)失效问题求助

解决data.table循环中get函数报错问题

问题背景

运行conTMLE函数时触发报错:

Error in get(paste0("int.A", k)) : first argument has length > 1

问题出在循环内的data.table赋值代码:

dt[, (paste0("W", k+1)):=(get(paste0("int.A", k)))/(get(paste0("fit.A", k)))]

尝试过添加as.character、循环内定义j=k(触发新报错eval(jsub, SDenv, parent.frame()) : object 'j' not found)、变量名前加..前缀等方法均无效。

解决方法

方法1:用..前缀明确引用外部循环变量

data.table中..前缀用于访问外部环境的变量,避免将循环变量k误解析为data.table的列。修改代码为:

dt[, (paste0("W", ..k + 1)) := get(paste0("int.A", ..k)) / get(paste0("fit.A", ..k))]

这样k会取当前循环的单个值,paste0生成唯一的列名字符串,get函数就能正常工作。

方法2:提前构造列名字符串

将列名拼接逻辑移到循环体外部,减少j表达式中的环境解析操作:

# 替换1:n为你的实际循环范围
for(k in 1:n){
  int_col <- paste0("int.A", k)
  fit_col <- paste0("fit.A", k)
  new_col <- paste0("W", k + 1)
  dt[, (new_col) := get(int_col) / get(fit_col)]
}

方法3:使用.SD引用列

.SD是data.table的当前子集对象,用.SD[[colname]]替代get函数,更符合data.table原生语法:

dt[, (paste0("W", ..k + 1)) := .SD[[paste0("int.A", ..k)]] / .SD[[paste0("fit.A", ..k)]]]

内容的提问来源于stack exchange,提问作者香结丁

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:33:13