8

最近、パッケージfactor=1に関数があることを知らずに、自分のワークスペースにオブジェクトを作成しました。factorbase

私が意図したのはfactor、並列ループ内で変数を使用することでした。たとえば、

library(plyr)
library(foreach)
library(doParallel)

workers <- makeCluster(2)
registerDoParallel(workers,cores=2)

factor=1

llply(
  as.list(1:2),
  function(x) factor*x,
  .parallel = TRUE,
  .paropts=list(.export=c("factor"))
     )

ただし、これによりエラーが発生し、理解するのに時間がかかりました。どうやら、その環境でplyrオブジェクトを作成しますが、代わりにユーザー提供のオブジェクトを使用します。次の例を参照してくださいfactorexportEnvbase::factor

llply(
  as.list(1:2),
  function(x) {
    function_env=environment();
    global_env=parent.env(function_env);
    export_env=parent.env(global_env);
    list(
      function_env=function_env,
      global_env=global_env,
      export_env=export_env,
      objects_in_exportenv=unlist(ls(envir=export_env)),
      factor_found_in_envs=find("factor"),
      factor_in_exportenv=get("factor",envir=export_env)
      )
    },
  .parallel = TRUE,
  .paropts=list(.export=c("factor"))
  )

stopCluster(workers)

の出力を調べるllplyと、(ユーザー提供のオブジェクトに対応する) 行ではなく、 の関数定義がfactor_in_exportenv=get("factor",envir=export_env)返されていることがわかります。1base::factor

質問 1) この動作をどのように理解できますか? 出力が になると予想していました1

質問 2)R別のパッケージ (私の場合など) で既に定義されているオブジェクトに新しい値を割り当てた場合に警告を受け取る方法はありfactorますか?

4

2 に答える 2

1

llply 関数は内部で「foreach」を呼び出します。Foreach は「parant.frame()」を使用して、評価する環境を決定します。llply の場合、parant.frame は何ですか? factor が定義されていない llply の関数環境です。

llply を使用する代わりに、foreach を直接使用してみませんか?

library(plyr)
library(foreach)
library(doParallel)

workers <- makeCluster(2)
registerDoParallel(workers,cores=2)

factor=1
foreach(x=1:2) %dopar% {factor*x}

この場合は自動的に行われるため、.export パラメータも必要ないことに注意してください。

于 2016-12-09T03:35:32.040 に答える