2016-12-02 77 views
1

我正在处理长向量,试图测试它们的所有元素是否为TRUE。这种情况发生的可能性不大,所以我希望all(myvector)只要找到一个FALSE值就会返回FALSE。这似乎并非如此。懒洋洋地评估矢量的所有元素都是真的?

system.time(all(rep(T, 100000000))) 
    user system elapsed 
    0.321 0.102 0.423 

system.time(all(c(F, rep(T, 100000000), F))) 
    user system elapsed 
    0.444 0.211 0.655 

任何方式,我可以加快这一点?

+0

大部分的时间在你的例子正在采取构建载体! –

+0

Derp!删除这个... – Ben

+0

请不要删除。 –

回答

3

您示例中的大部分时间都是构建向量。但是,有时您可以使用Rcpp加速这类事情,如Rcpp chapter of Hadley Wickham's Advanced R book中所述。

事实证明any()懒惰。在C++/Rcpp中重写它实际上会减慢它在懒惰(TRUE优先)情况下的速度,因为对C++的调用有一些开销,但是在非懒惰(TRUE-last)情况下加速了它(我的猜测是该加速是因为any()在基础R必须做一些其他的东西像查收NA值...)

x3 <- c(TRUE, rep(FALSE,1e7)) ## fast if lazy 
x4 <- c(rep(FALSE,1e7),TRUE) 
library(Rcpp) 
cppFunction(" 
bool any_C(LogicalVector x) { 
    return is_true(any(x)); 
}") 

library(microbenchmark) 
microbenchmark(any(x3),any(x4),any_C(x3),any_C(x4)) 
     expr  min   lq  mean  median   uq  max 
    any(x3)  1.224  1.6210  7.70592  9.1690 10.6430 53.431 
    any(x4) 18255.964 19069.7740 20104.43401 19501.6215 20028.3585 35843.360 
any_C(x3)  2.850  4.3735 15.94341 14.4195 24.1195 85.295 
any_C(x4) 7782.388 8279.9395 8832.22210 8700.9380 9161.2205 12339.606 
+0

谢谢Ben。我想删除我的尴尬问题,但我现在肯定不能这样做,这要归功于这个内容丰富的答案。此外,我有一种感觉有人会建议Rcpp。似乎是编写简单,快速方法的首选解决方案。 – Ben

相关问题