Неожиданное сообщение об ошибке при соединении data.table с rbindlist() с помощью mget()
При подготовке этого ответа я получил сообщение об ошибке
Ошибка: значение для '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][]
1 ответ
Это в основном потому что (в отличие от get
) mget
имеет inherits = FALSE
по умолчанию. Следовательно, это выглядит только в местной среде. Изменение на mget(df_names, inherits = TRUE)
(или, если вы хотите быть явно mget(df_names, envir = .GlobalEnv)
) должен это исправить.
Об этом @Arun на GH недавно сообщили независимо, и он намерен изменить поведение по умолчанию: mget
(при использовании в data.table
) соответствовать get
в будущем, так что следите за обновлениями.