使用mget()使用rbindlist()加入data.table时出现意外的错误消息

Uwe*_*Uwe 3 r data.table

在准备这个答案时,我收到了错误消息

错误:找不到"spine_hlfs"的值

从跑步

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

df_list <- mget(df_names)
setDT(giraffe)[rbindlist(df_list, idcol = "df.name"), on = "runkey", project := df.name][]
Run Code Online (Sandbox Code Playgroud)

按预期工作.

在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][]
Run Code Online (Sandbox Code Playgroud)

Dav*_*urg 6

这基本上是因为(不像get)mgetinherits = FALSE默认值.因此它只能在当地环境中看待.改为mget(df_names, inherits = TRUE)(或者,如果你想明确mget(df_names, envir = .GlobalEnv))应该解决这个问题.

这是由@Arun在GH上独立报道的,他打算改变mget(在a中使用data.table)的默认行为get以便在将来保持一致,敬请关注.