我正在尝试将磁盘中保存的40个列表(null1到null40)加载并合并到一个列表中:
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
有什么想法我做错了吗?
答案 0 :(得分:1)
让我们从创建一个可复制的示例开始。其他用户无权访问您引用的文件,因此让我们在本地创建一个。
# 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之类的方法来获取所有列表。
在一个可以创建一个named(!)列表的工作示例下面,将其保存,加载并合并。
# 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))
希望这将使您更接近解决方案。