我在RStudio中使用mclapply,希望每个进程都能输出到控制台,但这似乎被抑制了(例如,这里提到的:Is mclapply guaranteed to return its results in order?)。我怎样才能让R Studio打印出像这样的东西
x <- mclapply(1:20, function(i) cat(i, "\n"))
到控制台?
我尝试过print()、cat()、write(),但它们似乎都不起作用。我还尝试显式地设置mc.silent = FALSE,但没有任何效果。
发布于 2014-08-05 03:54:49
使用GUI的并行处理是有问题的。我写了很多并行代码,它经常使我同事的计算机崩溃,因为他坚持使用Rstudio而不是控制台R。
据我所知,RStudio“不会将派生进程的输出传播到RStudio控制台。如果要这样做,最好通过shell启动R。”
这对于RStudio人员来说是有意义的,因为当人们试图从一堆不同的进程输出到图形用户界面时,并行处理通常会破坏图形用户界面。它可以在控制台中工作(尽管通常不是按顺序进行的),但是当并行处理专家听说来自分支线程的任何I/O时,他们会感到很恼火。
如果必须有派生线程的输出,请将它们保存在字符串中并返回。然后从主进程中收集并输出。或者只使用控制台进行并行运行。我告诉我的同事,使用lapply()在RStudio中完成所有的调试和开发,然后切换到控制台进行实际运行。
发布于 2020-08-12 16:25:32
以下是使用shell echo打印到Rstudio中R控制台的解决方法:
#' Function which prints a message using shell echo; useful for printing messages from inside mclapply when running in Rstudio
message_parallel <- function(...){
system(sprintf('echo "\n%s\n"', paste0(..., collapse="")))
}发布于 2015-06-20 08:01:49
只是稍微扩展一下请求者使用的解决方案,即写入文件以检查进度:
write.file = '/temp_output/R_progress'
time1 = proc.time()[3]
outstuff = unlist(mclapply(1:1000000, function(i){
if (i %% 1000 == 0 ){
file.create(write.file)
fileConn<-file(write.file)
writeLines(paste0(i,'/',nrow(loc),' ',(i/nrow(loc)*100)), fileConn)
close(fileConn)
}
#do your stuff here
}, mc.cores=6))
print(proc.time()[3] - time1)然后,您可以通过控制台进行监控
tail -c +0 -f '/temp_output/R_progress'
https://stackoverflow.com/questions/17345837
复制相似问题