测试列表中所有成员之间的相等性

C8H*_*4O2 6 r list

检查列表中所有成员之间的相等性的正确语法是什么?我找到

do.call(all.equal, list(1,2,3))
Run Code Online (Sandbox Code Playgroud)

回报TRUE.

我的预感是,它检查列表元素内的相等性,而不是之间.

理想情况下,解决方案会忽略元素的名称,但不会忽略元素组件的名称.例如,给定输入它应该返回TRUE:

some_list <- list(foo = data.frame(a=1),
                  bar = data.frame(a=1))
Run Code Online (Sandbox Code Playgroud)

但输入结果为FALSE:

some_other_list <- list(foo = data.frame(a=1),
                        bar = data.frame(x=1))
Run Code Online (Sandbox Code Playgroud)

但我可以使用对元素名称敏感的解决方案.


编辑:显然我需要复习?funprog.作为已接受答案的后续行动,值得注意以下行为:

Reduce(all.equal, some_list)  # returns TRUE

Reduce(all.equal, some_other_list) #returns [1] "Names: 1 string mismatch"
Run Code Online (Sandbox Code Playgroud)

并为:

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"
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 6

1)如果列表中只包含问题中的两个组件,请尝试以下操作:

identical(some_list[[1]], some_list[[2]])
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)

2)或对于具有任意数量组件的一般方法,请尝试以下方法:

all(sapply(some_list, identical, some_list[[1]]))
## [1] TRUE

L <- list(1, 2, 3)
all(sapply(L, identical, L[[1]]))
## [1] FALSE
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)