使用mget()和rbindlist()连接data.table时出现意外错误信息

3

在准备这个回答时,我遇到了以下错误信息:

错误:未找到“spine_hlfs”的值

运行以下内容时出现的错误:

setDT(giraffe)[rbindlist(mget(df_names), idcol = "df.name"), on = "runkey", project := df.name][]

当...的时候
df_list <- mget(df_names)
setDT(giraffe)[rbindlist(df_list, idcol = "df.name"), on = "runkey", project := df.name][]

正常工作。

在github上报告问题之前,我想先向社区验证这是否确实是一个错误,或者是否有一个我不知道的简单解释来说明这个错误消息。

可重现的示例

set.seed(123L)
giraffe <- data.frame(runkey = 1:500,
                      X2 = sample.int(99L, 500L, TRUE),
                      X3 = sample.int(99L, 500L, TRUE),
                      X4 = sample.int(99L, 500L, TRUE),
                      project = "",
                      stringsAsFactors = FALSE)
spine_hlfs <- data.frame(runkey = c(1L, 498L, 5L))
ir_dia     <- data.frame(runkey = c(3L, 499L, 47L, 327L))
df_names <- c("spine_hlfs", "ir_dia")
library(data.table)

# this creates the error message
setDT(giraffe)[rbindlist(mget(df_names), idcol = "df.name"), on = "runkey", project := df.name][]
## Error: value for ‘spine_hlfs’ not found

# this works as expected
df_list <- mget(df_names)
setDT(giraffe)[rbindlist(df_list, idcol = "df.name"), on = "runkey", project := df.name][]

2
这只是太多嵌套环境了。尝试使用mget(df_names, envir = .GlobalEnv) - David Arenburg
1个回答

6
这主要是因为(与get不同)mget默认具有inherits = FALSE。因此,它只查找本地环境。更改为mget(df_names, inherits = TRUE)(或者,如果您想明确到mget(df_names, envir = .GlobalEnv)),应该可以解决此问题。 这在一段时间前由@Arun在GH上独立报告过,他打算将mget(在data.table中使用时)的默认行为更改为与get一致,因此请继续关注。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接