检查列表的所有成员之间是否相等的正确语法是什么?我发现
What is the right syntax to check equality between all members of a list? I found that
do.call(all.equal, list(1,2,3))返回TRUE.
我的直觉是,它正在检查列表元素内的相等性,而不是两者之间.
My hunch is that it is checking equality within elements of a list, not between.
理想情况下,解决方案将忽略元素的名称,但不忽略元素组件的名称.例如,给定输入,它应该返回TRUE:
Ideally the solution would ignore the name of the element, but not those of the element components. For example, it should return TRUE given the input:
some_list <- list(foo = data.frame(a=1), bar = data.frame(a=1))但是FALSE给出了输入:
But FALSE given the input:
some_other_list <- list(foo = data.frame(a=1), bar = data.frame(x=1))但是我可以接受对元素名称敏感的解决方案.
But I could live with a solution that was sensitive to the name of the element.
编辑:显然,我需要复习?funprog.作为接受的答案的后续措施,值得注意以下行为:
Edit: Clearly I need to review ?funprog. As a follow-up to the accepted answer, it's worth noting the following behavior:
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"
我的示例不足,并且在包含3个或更多元素的情况下Reduce不起作用:
Edit 2: My example was inadequate, and Reduce doesn't work in the case of 3 or more elements:
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推荐答案
1)如果该列表仅包含问题中的两个部分,请尝试以下操作:
1) IF the list has only two components as in the question then try this:
identical(some_list[[1]], some_list[[2]]) ## [1] TRUE2),或者对于具有任意数量组件的通用方法,请尝试以下操作:
2) or for a general approach with any number of components try this:
all(sapply(some_list, identical, some_list[[1]])) ## [1] TRUE L <- list(1, 2, 3) all(sapply(L, identical, L[[1]])) ## [1] FALSE3)减少与以前的解决方案相比,这有点冗长,但是由于已经讨论了Reduce,因此可以采用以下方法:
3) Reduce This is a bit verbose compared to the prior solution but since there was a discussion of Reduce, this is how it could be jmplemented:
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更多推荐
测试列表的所有成员之间是否相等
发布评论