在不同的R工作空间中组合同一列表的不同元素

时间:2022-03-16 19:39:11

For example: Three R workspaces A.RData, B.RData and C.RData.

例如:三个R工作空间A.RData,B.RData和C.RData。

  • In A.RData: A list object list.example <- list(1,2)
  • 在A.RData中:列表对象list.example < - list(1,2)
  • In B.RData: The same name list object list.example <- list(NULL,NULL,3)
  • 在B.RData中:相同名称列表对象list.example < - list(NULL,NULL,3)
  • In C.RData: The same name list object list.example <- list(NULL,NULL,NULL,4)
  • 在C.RData中:相同名称列表对象list.example < - list(NULL,NULL,NULL,4)

What i want to get in a new workspace is an object list.new.example printed as:

我想在新工作区中获得的是一个对象list.new.example打印为:

[[1]]
[1] 1

[[2]]
[1] 2

[[3]]  
[1] 3  

[[4]]  
[1] 4

I have tried

我努力了

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)

but it's not what i wanted. NULL is filling. So thanks.

但这不是我想要的。 NULL正在填充。那谢谢啦。

1 个解决方案

#1


1  

This kind of problem can be solved by loading each file in a separate environment. Then it's just a matter of extracting the element named list.example from each of them and combine in a list.

通过在单独的环境中加载每个文件可以解决这类问题。然后,只需从每个元素中提取名为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)]

Environments belong to the more advanced features of R that relatively few users are familiar with. They are however quite simple to understand and very useful, just think of them as unordered sets of named objects, that can be manipulated in same ways as an ordinary list. Like this

环境属于R的更高级功能,相对较少的用户熟悉。然而,它们很容易理解并且非常有用,只需将它们视为无序的命名对象集,可以像普通列表一样进行操作。喜欢这个

env[[1]]$list.example
env[[1]][["list.example"]]

#1


1  

This kind of problem can be solved by loading each file in a separate environment. Then it's just a matter of extracting the element named list.example from each of them and combine in a list.

通过在单独的环境中加载每个文件可以解决这类问题。然后,只需从每个元素中提取名为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)]

Environments belong to the more advanced features of R that relatively few users are familiar with. They are however quite simple to understand and very useful, just think of them as unordered sets of named objects, that can be manipulated in same ways as an ordinary list. Like this

环境属于R的更高级功能,相对较少的用户熟悉。然而,它们很容易理解并且非常有用,只需将它们视为无序的命名对象集,可以像普通列表一样进行操作。喜欢这个

env[[1]]$list.example
env[[1]][["list.example"]]