【发布时间】:2015-12-16 13:34:47
【问题描述】:
检查列表所有成员之间是否相等的正确语法是什么?我发现了
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。作为 accepted 答案的后续行动,值得注意的是以下行为:
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
【问题讨论】: