4

特定の条件の関数呼び出しで発生した回数を追跡する必要があるシミュレーションを実行しています。グローバルオブジェクトへの割り当てでこれを達成しようとしました。関数を実行すると機能しますが、私が行っているように関数を実行しようとすると、 fed tolapplyの各要素で発生するたびにカウントされるのではなく、条件が発生するすべての回数の単一のカウントが取得されます。listlapply

これは、発生が数の偶数であるダミーの状況です。

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

シミュレーション中なので、速度が問題になります。私はこれをできるだけ速くしたいので、私はグローバルな割り当てのアイデアと結婚していません。

4

3 に答える 3

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
于 2012-08-07T16:36:46.367 に答える
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)
于 2012-08-07T16:24:25.230 に答える
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)))

私はより良いアイデアを受け入れています(より速く)。

于 2012-08-07T16:23:34.960 に答える