library(parallel)
cl=makeCluster(4)
txts = c("I", "AM", "NOT", "PRINTED")
clusterApply(cl, txts, function(txt){write(txt, stderr())})
stopCluster(cl)
txts = c("WHILE", "I", "AM", "PRINTED")
lapply(txts, function(txt){write(txt,stderr())})
运行上述代码时,似乎忽略了从write
到clusterApply
的调用:什么都不会打印。
我要从clusterApply
打印的原因是,我要运行的代码预计将需要很多小时才能完成;我希望能够监视进度。
我发现了一种令人惊奇的从clusterApply
打印的方法;也就是说,通过clusterApply
通过Rcpp运行的C ++代码可以打印到控制台。不过,这样做似乎已经足够矫kill过头了。
还有其他从std::cerr
打印的方法吗?
答案 0 :(得分:1)
您可以使用makeCluster(4, outfile = "")
跟踪进度。这也会打开write(txt, stderr())
此解决方案outfile = ""
seems仅用于Linux系统。有关窗口的更多信息,请检查链接的问题和注释。似乎有些解决方案,例如使用Rterm代替Rgui,但由于无法测试,因此无法提供给您。
我在xubuntu 18.04上使用了以下代码并获得了所有调用。
library(parallel)
cl=makeCluster(4, outfile ="")
txts = c("I", "AM", "NOT", "PRINTED", seq(1,1000000,1))
clusterApply(cl, txts, function(txt){write(txt,stdout())})
stopCluster(cl)
摘自makeCluster的纪录片:
输出文件:
将stdout和stderr连接输出指向何处 来自工人。 “”表示没有重定向(只能是 对于本地计算机上的工作人员很有用)。默认为“ / dev / null” (在Windows中为“ nul:”)。另一种可能性是 工人的主人。当所有工作人员登录时,文件将以附加模式打开 到同一文件。
因此,如果要使用stderr
,则必须澄清输出文件
答案 1 :(得分:0)
您需要捕获在后台工作程序中生成的标准输出,并将其作为结果的一部分返回,然后在主R流程中将其重新输出。未来的框架会自动执行此操作,同时还会自动执行“中继”以及消息和警告条件:
> library(future.apply)
> cl <- parallel::makeCluster(4)
> plan(cluster, workers = cl)
> txts <- c("I", "AM", "ALSO", "PRINTED")
> y <- future_lapply(txts, function(txt) {
+ print(txt)
+ message("M: ", txt)
+ })
[1] "I"
M: I
[1] "AM"
M: AM
[1] "ALSO"
M: ALSO
[1] "PRINTED"
M: PRINTED
> parallel::stopCluster(cl)
仅供参考,在未来软件包的下一个版本中,将尽快中继工人的输出,即,在结果被收集并可用时尽快传递。在当前版本中,只有当所有工作人员都完成后,它才会中继。
其他评论:
您实际上并不想显式输出到stderr()
-有一个原因请参阅https://github.com/HenrikBengtsson/Wishlist-for-R/issues/55。
使用outfile = ""
创建PSOCK群集的方法应被视为是一种hack。该输出将以“背景”结束,R不能在任何地方捕获它,是否显示在很大程度上取决于您所运行的环境类型,即如果R在Linux的终端中运行,其行为会有所不同,在Windows上,在Windows上的Rgui中,在RStudio等上。