Работа с rlist в R: merge.list не работает - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь загрузить и объединить 40 списков (от нуля1 до нуля40), сохраненных на диске, в один список:

library(rlist)
for (i in 1:40){
assign(paste0("null",i), list.load(paste0("E:/Res/NullModel/null",i,".Rdata")))
}
null_all <- list.merge(get(paste0("null",1:40))) 

Я получаю эту ошибку:

Error: All arguments must be named list

Даже если я попробую только два списка:

 null_all <- list.merge(null1,null2)

Произошла такая же ошибка:

Error: All arguments must be named list

Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 30 октября 2018

Начнем с создания воспроизводимого примера. Другие пользователи не имеют доступа к файлам, на которые вы ссылаетесь, поэтому давайте создадим их локально.

# Create an example list and save to file
x <- list(1, 2)
fName <- "temp.rdata"
list.save(x, fName)

# Load and merge
for (i in 1:3){ assign(paste0("null",i), list.load(fName)) }
null_all <- list.merge(get(paste0("null",1:3)))

Это воссоздает проблему, которую вы описали. Проблема возникает из-за того, что элементы в этих списках не имеют имен. Сравните два примера ниже. В первом элементы имеют имена, и объединение выполняется без ошибок. Во втором я не назначил имена, и я получаю ошибку.

# Elements are named
named1 <- list(a=1, b=2)
named2 <- list(a=1, b=3)
list.merge(named1, named2) # Works fine

# Elements not names
notNamed1 <- list(1, 2)
notNamed2 <- list(1, 4)
list.merge(notNamed1, notNamed2) # Gives error

Я бы рекомендовал проверить объекты списка, чтобы убедиться, что элементы списков имеют имена.

Отдельно я не верю, что функция 'get' векторизована, то есть она будет работать только с первым элементом и получит только один из списков. Возможно, вам придется использовать что-то вроде lapply, чтобы получить все списки.

Ниже рабочий пример, который создает именованный (!) Список, сохраняет его, загружает и объединяет.

# Create named lists
x <- list(a=1, b=2)
fName <- "temp.rdata"
list.save(x, fName)

# Load and merge
for (i in 1:3){ assign(paste0("null",i), list.load(fName)) }
l.List <- lapply(1:3, function(x) get(paste0("null",x)))
list.merge(unlist(l.List, recursive = FALSE))    

Надеюсь, это приблизит вас к решению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...