3

関数でmclapplyは、リスト内の各項目ごとに実行する必要があり、セミグローバル変数も使用する必要がありますvar.1。すべてのリストアイテムに追加したくありませんvar.1。メモリが多すぎるからです。問題を説明するコードは次のとおりです。

library(parallel)

list.1 <- list(1,2,3,4)

myInnerFunction <- function(xx) {
  return(xx+var.1)
}

myOuterFunction <- function(list.x) {
  var.1 <- 17
  tmp.1 <- mclapply(list.x, myInnerFunction, mc.cores=6)
  return(tmp.1)
}

results <- myOuterFunction(list.x=list.1)
[1] "Error in FUN(X[[1L]], ...) : object 'var.1' not found\n"
results[[1]] # This should be 18

どうすればに渡すことができvar.1ますmclapplyか?var.1内で宣言する必要がありますmyOuterFunction

4

2 に答える 2

3

関数の 2 番目の ( var.1) 引数を作成できmyInnerFunctionます。

myInnerFunction <- function(xx, var.1) {
  return(xx+var.1)
}

コマンドでmyInnerFunction関数の 2 番目の引数を渡すことができるようになりました。mclapply

myOuterFunction <- function(list.x) {
  var.1 <- 17
  tmp.1 <- mclapply(list.x, myInnerFunction, var.1, mc.cores=6)
  return(tmp.1)
}

結果:

results <- myOuterFunction(list.x=list.1)


[[1]]
[1] 18

[[2]]
[1] 19

[[3]]
[1] 20

[[4]]
[1] 21
于 2012-12-03T10:00:21.130 に答える
2

関数クロージャはあなたが望むことを望みますか?

f引数として取り込んでvar.1、を返す関数を作成しますmyInnerFunction

f = function(var.1) {
    var.1 = var.1
    myInnerFunction <- function(xx)  return(xx+var.1)
}

次に、次のようmyOuterFunctionになります。

myOuterFunction <- function(list.x) {
    var.1 <- 17
    my = f(var.1)
    tmp.1 <- mclapply(list.x, my, mc.cores=6)
    return(tmp.1)
}

myOuterFunction(list.x=list.1)

期待どおりに動作します。

于 2012-12-03T09:56:26.707 に答える