在R中使用rlist:merge.list不起作用

时间:2018-10-30 16:06:57

标签: r list merge

我正在尝试将磁盘中保存的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

有什么想法我做错了吗?

1 个答案:

答案 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))    

希望这将使您更接近解决方案。