0

例如:三个 R 工作A.RDataB.RDataC.RData

  • In A.RData: 一个列表对象list.example <- list(1,2)
  • In B.RData: 同名列表对象list.example <- list(NULL,NULL,3)
  • In 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正在填充。那谢谢啦。

4

1 回答 1

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"]]
于 2015-01-22T12:06:00.173 回答