2016-12-02 78 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

相關問題