2017-10-31 16 views
1

私は、引数リストXの一意の要素だけを処理するlapply()mclapply()のバージョンを探しています。このようなものはすでに存在しますか?lapply()とmclapply()の冗長処理を避けるバージョン

EDIT:つまり、私はlapply()は、処理の重複を気にしないようにしたいが、私はlength(lapply(X, ...))length(X)を等しくする必要はなく、length(unique(X))(及び適切な値が一致します)。また、私はXの各要素がかなり小さいと仮定しているので、固有の値を取ることはあまり問題にならないはずです。

現在の行動:

long_computation <- function(task){ 
    cat(task, "\n") 
# Sys.sleep(1000) # 
    return(task) 
} 
tasks <- rep(LETTERS[1:2], 2) 
lapply(tasks, long_computation) 

## A 
## B 
## A 
## B 
## [[1]] 
## [1] "A" 
## 
## [[2]] 
## [1] "B" 
## 
## [[3]] 
## [1] "A" 
## 
## [[4]] 
## [1] "B" 

望ましい行動:lapply

(タスク、long_computation)

## A 
## B 
## [[1]] 
## [1] "A" 
## 
## [[2]] 
## [1] "B" 
## 
## [[3]] 
## [1] "A" 
## 
## [[4]] 
## [1] "B" 

することができますfind the intended use case here

+1

ユニーク入力適用の繰り返しに入る前にコンボを入力してください – hrbrmstr

+0

私はしたいと思いますが、私は完全な拡張結果を返す必要があります。重複が不規則に配列されていても、 'X = c(1,2,2,3,2,2,5,7,7,7) 'のようになります。 – landau

+0

つまり、' length(lapply(X、...) )) 'は' length(X) 'と等しくなければなりません。 – landau

答えて

0

これは実際に動作しているようです:

lightly_parallelize_atomic <- function(X, FUN, jobs = 1, ...){ 
    keys <- unique(X) 
    index <- match(X, keys) 
    values <- mclapply(X = keys, FUN = FUN, mc.cores = jobs, ...) 
    values[index] 
} 

そして、私の場合、それはXがアトミックであること大丈夫です。

しかし、すでにパッケージまたはRのいずれかに組み込まれているものを見つけるのはうまくいくでしょう。

0

このようなことを試すことができます:long_computationの後に結果を格納するmapオブジェクトを作成しました。既存の「鍵」に遭遇すると、mapから戻り、それ以外の場合はlong_computation関数が呼び出され、結果はmapに保存されます。理想的な方法かどうかは分かりませんが、それは機能します。

tasks <- rep(letters[1:2], 2) 
map=list() 

lapply(tasks,function(t){if(t %in% names(.GlobalEnv$map)){ 
    return(.GlobalEnv$map[[t]]) 
}else{ 
    result=toupper(t) 
     if(!t %in% names(.GlobalEnv$map)){ 
      .GlobalEnv$map[[t]]=result 
     } 
    } 
}) 
+0

良い考えですが、複数のプロセスが '.GlobalEnv $ map [[t]]'にアクセスしようとすると、 'mclapply()'に競合状態が存在するようです。 – landau

+0

@landauしかし、ここでは 'mclapply'を使っていません。また、パラレル/マルチコアのルートにしたい場合は、 'export'オプションを使って複数のコア間で変数を共有することができます。 'mclapply'では可能ではないかもしれませんが、' foreach'を使うと可能です。 – TUSHAr

関連する問題