2012-08-07 28 views
4

我正在運行一個模擬程序,我需要跟蹤特定條件的函數調用中出現的次數。我試圖通過賦值給一個全局對象來完成這個任務。它可以運行,如果你運行的功能,但如果你試着lapply功能,我正在做的那麼你得到的條件發生的所有時間單次計數,而不是每次發生的list饋送給每個元素的計數lapply計數條件在lapply中的出現

這裏是一個虛擬的情況的發生是一個數字的均勻性:

FUN <- function(x){ 
    lapply(1:length(x), function(i) { 
     y <- x[i] 
     if (y %% 2 == 0){ 
      assign("count.occurrences", count.occurrences + 1, env=.GlobalEnv) 
     } 
     print("do something") 
    }) 
    list(guy="x", count=count.occurrences) 
} 

#works as expected 
count.occurrences <- 0 
FUN(1:10) 


count.occurrences <- 0 
lapply(list(1:10, 1:3, 11:16, 9), FUN) 

#gives me... 
#> count.occurrences 
#[1] 9 

#I want... 
#> count.occurrences 
#[1] 5 1 3 0 

這是在模擬這樣的速度是一個問題。我希望這樣做盡可能快,所以我沒有結婚到全球任務的想法。

+3

您希望我們改進您的單行解決方案嗎? – Andrie 2012-08-07 15:41:27

+0

@Andrie,感謝評論(+1),當我開始輸入問題時,我無法想象如何去做,因爲我沒有考慮它是如何返回列表中的'count.occurances'但是當它發生在我身上時已經打出了問題。無論如何,我認爲全球任務的成本很高,而且有更好的方法可以做到。 – 2012-08-07 16:08:42

+0

如果這是我能做的最好的,我將刪除編輯到我的問題,並將其添加爲答案。 – 2012-08-07 16:09:12

回答

8

而不是分配給全球環境,爲什麼不直接分配給FUN的環境裏面?

FUN <- function(x){ 
    count.occurances <- 0 
    lapply(1:length(x), function(i) { 
     y <- x[i] 
     if (y %% 2 == 0){ 
      count.occurances <<- count.occurances + 1 
     } 
     print("do something") 
    }) 
    list(guy="x", count=count.occurances) 
} 

Z <- lapply(list(1:10, 1:3, 11:16, 9), FUN) 

然後,你可以拉出計數。

> sapply(Z, `[[`, "count") 
[1] 5 1 3 0 
+0

我認爲這是要走的路線,儘管在這個模擬中的任何一個基準測試都不在問題範圍之內。 – 2012-08-07 19:52:29

0

我能得到這樣的:

count.occurances <- 0 
Z <-lapply(list(1:10, 1:3, 11:16, 9), FUN) 
diff(c(0, sapply(1:length(Z), function(x) Z[[x]]$count))) 

我接受更好的想法(快)。

2

我還沒有對此做過任何基準測試,但是您是否嘗試過使用for循環?我知道R中一般不鼓勵循環,但它們也不總是較慢。

FUN <- function(x) { 
    count.occurrences = 0 
    for (i in 1:length(x)) { 
    y = x[i] 
    if (y %% 2 == 0) { 
     count.occurrences = count.occurrences + 1 
    } 
    print("do something") 
    } 
    list(guy="x", count=count.occurrences) 
} 

lapply(list(1:10, 1:3, 11:16, 9), FUN) 
+0

哦,我修復了這個函數中發生的拼寫;-) – A5C1D2H2I1M1N2O1R2T1 2012-08-07 16:26:06

+0

好點mrdwab,我在這裏說明了這件事:http://stackoverflow.com/questions/10467322/loops-in-r - 需要使用索引 - 無論如何避免 - 爲/ 10467375#10467375 – 2012-08-07 16:26:48

+0

我懶得修復拼寫後我張貼。在R它沒有抓住拼寫,但在它的職位(我使用鉻)的標題,所以我在那裏修復它。 :) – 2012-08-07 16:27:46