检查列表中所有成员之间的相等性的正确语法是什么?我找到了
do.call(all.equal, list(1,2,3))
返回TRUE
。
我的预感是它检查列表元素内的相等性,而不是在。
之间理想情况下,解决方案会忽略元素的名称,但不会忽略元素组件的名称。例如,给定输入它应该返回TRUE:
some_list <- list(foo = data.frame(a=1),
bar = data.frame(a=1))
但输入时为FALSE:
some_other_list <- list(foo = data.frame(a=1),
bar = data.frame(x=1))
但我可以使用对元素名称敏感的解决方案。
修改:显然,我需要审核?funprog
。作为接受答案的后续行动,值得注意以下行为:
Reduce(all.equal, some_list) # returns TRUE
Reduce(all.equal, some_other_list) #returns [1] "Names: 1 string mismatch"
并且:
yet_another_list <- list(foo = data.frame(a=1),
bar = data.frame(x=2))
Reduce(all.equal, yet_another_list)
# returns: [1] "Names: 1 string mismatch" "Component 1: Mean relative difference: 1"
编辑2:我的示例不充分,Reduce
在3个或更多元素的情况下不起作用:
some_fourth_list <- list(foo = data.frame(a=1),
bar = data.frame(a=1),
baz = data.frame(a=1))
Reduce(all.equal, some_fourth_list) # doesn't return TRUE
答案 0 :(得分:5)
1)如果该列表中只包含两个问题,请尝试以下方法:
identical(some_list[[1]], some_list[[2]])
## [1] TRUE
2)或对于包含任意数量组件的一般方法,请尝试以下方法:
all(sapply(some_list, identical, some_list[[1]]))
## [1] TRUE
L <- list(1, 2, 3)
all(sapply(L, identical, L[[1]]))
## [1] FALSE
3)减少与先前的解决方案相比,这有点冗长,但由于讨论了Reduce
,这就是它的实现方式:
Reduce(function(x, y) x && identical(y, some_list[[1]]), init = TRUE, some_list)
## [1] TRUE
Reduce(function(x, y) x && identical(y, L[[1]]), init = TRUE, L)
## [1] FALSE
答案 1 :(得分:0)
这个怎么样:
identical(unlist(some_list), unlist(some_other_list))