我正在尝试使用doSMP包使用'foreach'循环来加速我的代码。
以下是我的问题的简化版本:我正在运行名为main.R
的文件file:main.R:
require(doSMP)
dropbox_path = "/home/ruser/Dropbox"
workers <- startWorkers(4)
registerDoSMP(workers)
foreach(jj=1:4 ) %dopar% source("test.R")
stopWorkers(workers)
file:test.R:
message(dropbox_path)
返回以下错误: “源代码错误(”test.R“): 任务1失败 - “找不到对象'dropbox_path'”
如果我将main.R修改为:
require(doSMP)
dropbox_path = "/home/ruser/Dropbox"
workers <- startWorkers(4)
registerDoSMP(workers)
foreach(jj=1:4 ) %dopar% message(dropbox_path)
stopWorkers(workers)
然后效果很好。 它也常用于顺序代码('for'而不是'foreach')。
所以R子实例可以访问dropbox_path变量,但不能通过源函数解析它。我尝试使用source()函数参数'local'和'chdir'而没有成功。
您是否知道代码的工作方式?我想继续使用source()函数。
答案 0 :(得分:1)
我提前道歉我的小解决方法不使用你的工具,但这是我将如何做到的。我使用包snowfall
因为我可以轻松扩展我的应用函数以在多个核上工作。代码未经过测试,因为我的所有内核都已被占用。但是应该可以工作。
tiny_script.R
内容:
date()
用于启动多个核心的R代码:
library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK") #power up
my.list <- vector("list", 10)
sfLapply(x = my.list, fun = function(x) source("./Odpad/tiny_script.R"))
仅使用lapply
在单核上运行:
> lapply(X = my.list, FUN = function(x) source("./Odpad/tiny_script.R")) #notice the difference in argument names between `lapply` and `sfLapply`.
[[1]]
[[1]]$value
[1] "Wed Jun 22 13:02:11 2011"
[[1]]$visible
[1] TRUE
[[2]]
[[2]]$value
[1] "Wed Jun 22 13:02:11 2011"