r data.table - 当环境对象存在时,空dt上的链式和非链式语句之间的差异

时间:2016-01-15 01:24:00

标签: r data.table

示例

考虑data.table

## clear environment
## rm(list=ls())
library(data.table)  ## v1.9.6
dt <- data.table(id = c(1,2),
                val = c("a","a"),
                val2 = c("x","y"))
dt
# id val val2
# 1:  1   a    x
# 2:  2   a    y

toFind <- c(1,2)  ## vector of ids to find.

如果过滤data.table以便没有找到任何观察结果(即它是空的),则这两个等式是等效的

dt[!(id %in% toFind)][, .(val, val2, val3)]
## error - object 'val3' not found
dt[!(id %in% toFind), .(val, val2, val3)]
## error - object 'val3' not found

这是有道理的,因为data.table中没有val3

如果我们现在创建一个对象val3

## create object 'val3'
val3 <- "temp"

然后相同的两个陈述产生不同的结果:

dt[!(id %in% toFind), .(val, val2, val3)]  ## returns empty dt
## Empty data.table (0 rows) of 3 cols: val, val2, val3

dt[!(id %in% toFind)][, .(val, val2, val3)]  ## returns error
## error in setnames(jval, jvnames) :
##      Can't assign 3 names to a 1 column data.table
##    ...

如果data.table被过滤以使其不为空,则两个语句再次等效,对象val3作为dt的列包含在结果中

toFind <- c(1)
dt[!(id %in% toFind), .(val, val2, val3)]
# val val2 val3
# 1:   a    y temp

dt[!(id %in% toFind)][, .(val, val2, val3)]
# val val2 val3
# 1:   a    y temp

问题

如果在data.table中返回空i,那么链接的data.table语句([subset(i)][, select(j)])是否打算以与equivelant非链式语句不同的方式处理环境对象({ {1}})?

0 个答案:

没有答案