我有几个向量的列表。我想检查列表中的所有向量是否相等。 identical
仅适用于成对比较。所以我写了下面的函数,对我来说看起来很丑。我仍然没有找到更好的解决方案。这是我的RE:
test_true <- list(a=c(1,2,3),b=c(1,2,3),d=c(1,2,3))
test_false <- list(a=c(1,2,3),b=c(1,2,3),d=c(1,32,13))
compareList <- function(li){
stopifnot(length(li) > 1)
l <- length(li)
res <- lapply(li[-1],function(X,x) identical(X,x),x=li[[1]])
res <- all(unlist(res))
res
}
compareList(test_true)
compareList(test_false)
有什么建议?是否有本机检查是否完全相同,而不仅仅是成对比较?
最佳答案
怎么样
allSame <- function(x) length(unique(x)) == 1
allSame(test_true)
# [1] TRUE
allSame(test_false)
# [1] FALSE
正如@JoshuaUlrich在下面指出的那样,
unique
在列表上可能会变慢。此外,identical
和unique
可以使用不同的条件。 Reduce
是我最近了解的用于扩展成对运算的功能:identicalValue <- function(x,y) if (identical(x,y)) x else FALSE
Reduce(identicalValue,test_true)
# [1] 1 2 3
Reduce(identicalValue,test_false)
# [1] FALSE
在找到一个不匹配项之后,这会继续低效地进行比较。我对此的粗略解决方案是写
else break
而不是else FALSE
并引发错误。