2

ggplotRで関数を実行していますが、データをプロットにプッシュする前に、データを変換してサブセット化するために複数のコマンドを実行するため、実行に時間がかかる可能性があります。この関数を複数回実行して、引数の値を調整する必要があります。私が提供する例は単純なものです...しかし、それをどのようにスピードアップするか疑問に思っていましたか?スケールアップした場合、つまり、すべての組み合わせを取得するための最速の方法は何ですか...forループをmclapplyより高速であると仮定して変換する一般的な方法はありますか...特定の方法の好みを示す代替の模擬例を自由に提供してください

モックの例:

基本機能:

ff <- function(n, mu, stdev){
     x1 <- c(1:n)
     y1 <- rnorm(n,mu,stdev)
     z1 <- data.frame(cbind(x1,y1))
     ggplot(z1, aes(x=x1,y=y1))+
       geom_point()+
       labs(title=paste("n=",n,"mu=",mu, "stdev=",stdev))
}

したがって、パラメータを通過するための便利な方法は、次のことを行うことです...

for(i in 1:10){
    for(j in 1:2){
       for(k in seq(100,500,by=100)){
         ff(k,i,j)
       }
    }
}

これをスピードアップする最速の方法は何でしょうか?私はそれが次のようなものを必要とするかもしれないと思いますそして各行を実行するexpand.grid(x=c(1:10),y=c(1:2),z=seq(100,500,by=100))ために使用mclapplyする...ある種の並列の方法で?(これには4つのコアがあります)。速度を大幅に向上させる方法で、基本機能からビットを抜いたり、基本機能に入れたりしてください。各パラメーターの範囲を増やすと、プロセスに明らかに時間がかかりますが、それについてできることは何もありません...または、より多くのコアなどに分割した場合、それも何らかの方法で変更できますか?

ボーナスポイントについては...出力画像を保存し、パッケージのようにスライダーを作成しmanipulateてすべてのパラメーターをインタラクティブに処理するものはありますか...それが行うのは、関連する画像を引き出すことだけです。毎回再計算するよりも。

注意:foreachソリューションに役立つと思われる他のパッケージ(など)を自由に使用/提案してください。

4

2 に答える 2

1

を使用する場合mclapplyは、for ループを使用するのではなく、パラメータをリストに結合して関数に渡します。

例えば

df <- expand.grid(i = 1:10, j = 1:2 , k = seq(100, 500, 100))
params <- mapply(list, n = df[, 3], mu = df[, 1], stdev = df[,2], SIMPLIFY = F)

ff <- function(tlist) {
    n <- tlist$n 
    mu <- tlist$mu 
    stdev <- tlist$stdev
     x1 <- c(1:n)
     y1 <- rnorm(n,mu,stdev)
     z1 <- data.frame(cbind(x1,y1))
     ggplot(z1, aes(x=x1,y=y1))+
       geom_point()+
       labs(title=paste("n=",n,"mu=",mu, "stdev=",stdev))
}

results <- llply(params, ff, .progress='text')

使用する場合mclapply

results <- mclapply(params, ff, mc.cores = 4, mc.preschedule = TRUE)
于 2012-10-08T22:59:05.973 に答える
1

出力画像を非常に簡単に保存します。ggsave()関数を呼び出すだけff()です。

ff <- function(n, mu, stdev){
  x1 <- c(1:n)
  y1 <- rnorm(n,mu,stdev)
  z1 <- data.frame(cbind(x1,y1))
  ggplot(z1, aes(x=x1,y=y1))+
    geom_point()+
    labs(title=paste("n=",n,"mu=",mu, "stdev=",stdev))
  ggsave(paste0(n,"_", mu, "_", stdev, ".jpeg"))
}

あなたは を使用するという提案に的を射ていましたexpand.grid()。これが私がすることです:

x <- expand.grid(i = 1:10, j = 1:2, k = seq(100,500,100))

そして、それを呼び出すには、Linux を使用していて複数のコアが利用可能な場合はlapply()orを使用mclapply()します。

lapply(seq(nrow(x)), function(i) ff(x[i,2], x[i,1], x[i,3]))

これにより、「n_mu_stdev.jpeg」という命名規則を持つ 100 個の jpeg が作成されます。これらにアクセスして画面にレンダリングする効率的な方法については、Web ブラウザーといくつかの単純な CSS と jQuery を調べて、それを純粋なものにします。私見ですが、それは本当に別の質問です。

于 2012-10-08T23:00:41.670 に答える