最近、パッケージfactor=1
に関数があることを知らずに、自分のワークスペースにオブジェクトを作成しました。factor
base
私が意図したのは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
オブジェクトを作成しますが、代わりにユーザー提供のオブジェクトを使用します。次の例を参照してくださいfactor
exportEnv
base::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)
返されていることがわかります。1
base::factor
質問 1) この動作をどのように理解できますか? 出力が になると予想していました1
。
質問 2)R
別のパッケージ (私の場合など) で既に定義されているオブジェクトに新しい値を割り当てた場合に警告を受け取る方法はありfactor
ますか?