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

如何在data.table的更新连接中用env参数替代mget?

正确使用env参数替代mget的实现方式

你之前的代码错误在于直接将字符串赋值给目标列,而非引用对应的i.前缀列,且env参数的用法不符合data.table的执行逻辑。以下是两种可行的正确实现:

方法一:结合.SD与.SDcols

library(data.table)

X <- data.table(id = 1:5, L = letters[1:5])
Y <- data.table(id = 3:5, L = c(NA, "g", "h"), N = c(10, NA, 12))

ucols <- names(Y)[names(Y) %in% names(X)]
X[Y, on = .(id), (ucols) := .SD, .SDcols = paste0("i.", ucols), env = list(ucols = ucols)]

方法二:用lapply+get引用列

library(data.table)

X <- data.table(id = 1:5, L = letters[1:5])
Y <- data.table(id = 3:5, L = c(NA, "g", "h"), N = c(10, NA, 12))

ucols <- names(Y)[names(Y) %in% names(X)]
X[Y, on = .(id), (ucols) := lapply(paste0("i.", ucols), get), env = list(ucols = ucols)]

逻辑说明

  • env参数的作用是向j表达式的执行环境注入变量,确保ucols能被正确解析;
  • 两种方法本质都是通过构造i.前缀的列名,从连接的右表(Y)中提取对应列的值,赋值给左表(X)的匹配列,效果与mget(paste0("i.",ucols))完全一致。

内容的提问来源于stack exchange,提问作者Rooh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:19:51