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

在data.table连接中使用eval表达式报错的原因咨询

问题解析:data.table连接中eval()无法识别i.前缀变量的原因

核心问题

在data.table的连接更新操作中,A[B,on='flag', b := eval(ex)]报错找不到i.a,但其他包含i.a的写法却能正常运行,本质是**eval()的执行环境与data.table的特殊作用域不匹配**。

原因拆解

data.table对x[i, j]中的j参数有特殊处理逻辑:

  • 当j是直接表达式(比如b:=a+i.a),或是把包含赋值的完整表达式通过eval()传入时,这个表达式会在data.table专属作用域中执行。该作用域会自动识别i.前缀(代表连接中i表的列)、.SD等data.table特有的变量/符号。
  • 但如果写成b := eval(ex),此时eval(ex)是在**当前调用环境(通常是全局环境)**中执行的,而全局环境里不存在i.a这个对象——i.a是data.table连接时临时生成的特殊变量,仅在data.table的专属作用域内有效,因此会触发"object 'i.a' not found"的错误。

可行写法的逻辑验证

  1. ex = parse(text = "b:=a+i.a"); A[B,on='flag',eval(ex)]:完整赋值表达式在data.table作用域执行,i.a被正确识别。
  2. ex = parse(text = "a+i.a"); A[B,on='flag',eval(ex)]:计算表达式在data.table作用域执行,可正常访问i.a。
  3. A[B,on='flag', b:=a+i.a]:直接在data.table作用域解析表达式,无作用域匹配问题。

总结

若要通过字符串生成表达式实现连接更新,要么把包含赋值的完整语句(b:=...)解析后用eval()传入j参数,要么直接将计算表达式用eval()作为j参数,避免在赋值符号右侧单独使用eval()——后者会脱离data.table的特殊作用域,无法识别i.前缀的变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:20:53