Неожиданное сообщение об ошибке при соединении 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 в будущем, так что следите за обновлениями.

Другие вопросы по тегам