我想在每个tclTaskSchedule线程中执行一个tcltk2计时器(来自tcltk2包)。但是,下面的最小代码
library(doParallel)
n <- detectCores()
cl <- makeCluster(n, outfile="out.log")
registerDoParallel(cl)
testfn <- function() print(paste("hello from", i))
foreach(i=1:n, .packages = c("tcltk", "tcltk2"), .verbose = T) %dopar% {
tclTaskSchedule(1000, testfn(), id = paste0("task", i), redo = 10)
}
stopCluster(cl)结果出现错误(不是在控制台中打印,而是在out.log中打印)
Error in eval(expr, envir, enclos) : could not find function "testfn"但是,从.verbose = T参数中,我可以从控制台看到testfn正在导出:
automatically exporting the following variables from the local environment:
testfn实际上,用foreach调用.export = "testfn"会导致相同的错误。
那么出什么问题了?
(我为什么要这么做?最后,我希望在一定的时间间隔异步地民意测验一些数据源,并且每个数据源都有自己的特定轮询间隔)
发布于 2013-11-01 00:31:03
我同意Roland的观点,问题在于tclTaskSchedule评估其论点的方式。我的解决方案不是很好,但我通过使用clusterExport导出clusterExport并在foreach循环中将i分配给工人的全局环境来工作:
testfn <- function() print(paste("hello from", i))
clusterExport(cl, "testfn")
foreach(i=1:n, .packages = c("tcltk", "tcltk2"), .verbose = F) %dopar% {
i <<- i
tclTaskSchedule(1000, testfn(), id = paste0("task", i), redo = 10)
}我可能也会通过.noexport="testfn"来预测,但这并不是必要的。
发布于 2013-11-01 00:43:12
您还会发现另一个问题,即使没有tclTaskSchedule:并行foreach循环中的print语句不会将输出到交互式会话:
来自博客文章:
foreach的一个问题是,它为循环的每一次迭代创建新的RScript实例,从而防止状态消息被记录到控制台输出。
所做的工作是创建一个输出日志文件:
cat("", file="log.txt")
testfn <- function() cat("hello from", i, "\n", file="log.txt", append=TRUE)
foreach(i=1:n, .packages = c("tcltk", "tcltk2"), .verbose = T) %dopar% {
tclTaskSchedule(1000, testfn(), id = paste0("task", i), redo = 10)
}然后可以使用tail -f log.txt从bash终端监视这一点。
https://stackoverflow.com/questions/19651274
复制相似问题