R 根据列条件联接两个数据表

R 根据列条件联接两个数据表,r,data.table,R,Data.table,我想知道基于列条件的两个data.table的连接是如何工作的!那么使用哪一列,内部还是/在外部 require(data.table) outer <- data.table(KeyColumn=letters, value_outer=seq_along(letters)) inner <- data.table(KeyColumn=letters[4:6], value_inner=c(100,101,102)) setkey(outer, KeyColumn) setk

我想知道基于列条件的两个data.table的连接是如何工作的!那么使用哪一列,内部还是/在外部

require(data.table)

outer <- data.table(KeyColumn=letters, value_outer=seq_along(letters))
inner  <- data.table(KeyColumn=letters[4:6], value_inner=c(100,101,102))

setkey(outer, KeyColumn)
setkey(inner, KeyColumn)

outer[inner] # works as expected

inner[value_outer<10] # error as expected, because column doesn't exist in inner

outer[inner[value_outer<10], NewColumn := value_inner] # why does this work?
require(data.table)

外部感谢@eddi在评论中回答:


internal
查看它的列,没有找到
value\u outer
,因此查看它的父环境,即
outer
,因此
value\u outer
outer$value\u outer

相同,如果
value\u outer
列存在于
internal
中,那么将使用它,否则,您编写的内容相当于
outer[internal[outer[,value\u outer<10]],NewColumn:=value\u inner]
,现在您可以查看每个组件并了解发生了什么on@eddi其中
inner[outer[,value\u outer<10]]
来自何处?@DavidArenburg我刚刚用一种等效的方式重写了OP的表达式(也就是说,如果
internal
没有该列,我所拥有的和OP所写的都会做完全相同的事情),这样做的好处是,您可以单独查看每一件作品,以了解OP的表达式为何会起作用(而OP的表达式只是偶然起作用)@eddi,我知道你的代码是等效的,但我不明白OPs代码为什么工作,也就是说,引擎盖下发生了什么?你的行还是别的?
internal
查看它的列,没有找到
value\u outer
,所以查看它的父环境,即
outer
,因此
value\u outer
相同ode>外部$value\u外部