@agstudy 和@Julius 的答案涉及(长)lis 对象的循环;这是一个替代方法,假设 lis 的所有元素与 vec 的长度相同,以允许对未列出的参考进行矢量比较
shortloop <- function(x, lst)
colSums(matrix(unlist(lst) == x, length(x))) == length(x)
当lis 比vec 长时速度更快。
longloop <- function(x, lst)
sapply(lst, identical, x)
l1 = rep(lis, 1000)
microbenchmark(shortloop(vec, l1), longloop(vec, l1))
## Unit: microseconds
## expr min lq median uq max neval
## shortloop(vec, l1) 793.009 808.2175 896.299 905.8795 1058.79 100
## longloop(vec, l1) 18732.338 21649.0770 21797.646 22107.7805 24788.86 100
有趣的是,与lapply 中的隐式循环相比,从性能角度来看,使用for 并没有那么糟糕(尽管更复杂且容易出错)
longfor <- function(x, lst) {
res <- logical(length(lst))
for (i in seq_along(lst))
res[[i]] = identical(x, lst[[i]])
res
}
library(compiler)
longforc = cmpfun(longfor)
microbenchmark(longloop(vec, l1), longfor(vec, l1), longforc(vec, l1))
## Unit: milliseconds
## expr min lq median uq max neval
## longloop(vec, l1) 18.92824 21.20457 21.71295 21.80009 23.23286 100
## longfor(vec, l1) 23.64756 26.73481 27.43815 27.61699 28.33454 100
## longforc(vec, l1) 17.40998 18.28686 20.47844 20.75303 21.49532 100