【发布时间】:2015-10-16 14:06:42
【问题描述】:
我正在努力了解 Snowfall 库及其用法。
在编写使用环境的模拟时,我遇到了以下问题。如果我获取一个文件以在并行模式下加载函数,则该函数使用的环境似乎与我在并行模式下直接声明该函数时使用的环境不同。
为了让事情更清楚一点,让我们考虑以下两个脚本:
q_func.R 声明函数
foo.bar <- function(x, envname) assign("val", x, envir = get(envname))
# assigns the value x to the variable "val" in the environment envname
q_snowfall.R 使用降雪的主函数
library(snowfall)
SnowFunc <- function(envname) {
# load the functions
# Option 1 not working
source("q_func.R")
# Option 2 working...
# foo.bar <- function(x, envname) assign("val", x, envir = get(envname))
# create the new environment
assign(envname, new.env())
# use the function as declared in q_func.R
# to assign random numbers to the new env
foo.bar(x = rnorm(1), envname = envname)
# return the environment including the random values
return(get("val", envir = get(envname)))
}
sfInit(parallel = TRUE, cpus = 2)
# create environment 'a' and 'b' that each will get a new variable
# called 'val' that gets assigned a random value
envs <- c("a", "b")
result <- sfClusterApplyLB(envs, SnowFunc)
sfStop()
如果我执行脚本“q_snowfall.R”我会得到错误
Error in checkForRemoteErrors(val) :
2 nodes produced errors; first error: object 'a' not found
但是,如果我使用第二个选项(在 SnowFunc 函数中声明该函数,错误就会消失。
您知道 Snowfall 如何处理不同的环境吗?或者你甚至有解决这个问题的办法。 (请注意,'q_func.R' 实际上需要大约 100 行代码,因此我更愿意将它放在单独的文件中,因此“保留选项 2”不是解决方案!)
非常感谢!
编辑
如果我将所有get(envname) 更改为get(envname, envir = globalenv()),它似乎可以工作。但在我看来,这或多或少是一种解决方法,而不是一个非常类似于降雪的解决方案。
【问题讨论】:
标签: r parallel-processing snowfall