Объедините разные элементы одного и того же списка в разных рабочих пространствах R

Например: три рабочих пространства R A.RData, B.RData а также C.RData,

  • В A.RData: Объект списка list.example <- list(1,2)
  • В B.RData: Объект с тем же именем list.example <- list(NULL,NULL,3)
  • В C.RData: Объект с тем же именем list.example <- list(NULL,NULL,NULL,4)

То, что я хочу получить в новом рабочем пространстве, это объект list.new.example печатается как:

[[1]]
[1] 1

[[2]]
[1] 2

[[3]]  
[1] 3  

[[4]]  
[1] 4

я пытался

file.full <- list.files(directory, full.names = TRUE)
list.new.example <- list()
for (i in 1:3) {
   load(file.full[i])
list.new.example <- c(list.new.example, list.example)
}
print(list.new.example)

но это не то, что я хотел. NULL наполняет Тогда спасибо.

1 ответ

Решение

Такую проблему можно решить, загрузив каждый файл в отдельную среду. Тогда это просто вопрос извлечения элемента с именем list.example от каждого из них и объединить в список.

# Create the data
setwd(tempdir())
list.example <- list(1,2)
save(list.example, file="A.RData")
list.example <- list(NULL,NULL,3)
save(list.example, file="B.RData")
list.example <- list(NULL,NULL,NULL,4)
save(list.example, file="C.RData")

# Load
files <- c("A.RData", "B.RData", "C.RData")
env <- lapply(files, function(f){
    e <- new.env()
    load(f, envir=e)
    e
})

# Tidy up
l <- lapply(env, "[[", "list.example")
l <- unlist(l, recursive=FALSE)
list.new.example <- l[!sapply(l, is.null)]

Среды относятся к более продвинутым функциям R, с которыми знакомы относительно немногие пользователи. Однако они довольно просты для понимания и очень полезны, просто представьте их как неупорядоченные наборы именованных объектов, которыми можно манипулировать так же, как и в обычном списке. Как это

env[[1]]$list.example
env[[1]][["list.example"]]
Другие вопросы по тегам