Печать из mclapply в R Studio
Я использую mclapply изнутри RStudio и хотел бы получить вывод на консоль от каждого процесса, но, похоже, это как-то подавлено (как упомянуто, например, здесь: гарантированно ли mclapply будет возвращать свои результаты по порядку?). Как я могу заставить R Studio напечатать что-то вроде
x <- mclapply(1:20, function(i) cat(i, "\n"))
на консоль?
Я пробовал print(), cat(), write(), но все они, похоже, не работают. Я также пытался установить mc.silent = FALSE
явно без эффекта.
2 ответа
Параллельная обработка с GUI проблематична. Я пишу много параллельного кода, и он постоянно ломает компьютер моего коллеги, потому что он настаивает на использовании Rstudio вместо консоли R.
Из того, что я прочитал, RStudio "не распространяет вывод разветвленных процессов на консоль RStudio. Если вы делаете это, лучше всего запускать R через оболочку".
Это имеет смысл как обходной путь для людей RStudio, потому что параллельная обработка обычно ломает GUI, когда люди пытаются вывести на GUI из группы различных процессов. Он работает в консоли (хотя часто и не по порядку), но гуру параллельной обработки ущипнут свои носы, когда услышат о каком-либо вводе-выводе из разветвленного потока.
Если вы должны иметь вывод из разветвленных потоков, сохраните их в строку и верните. Затем собирать и выводить из основного процесса. Или просто используйте консоль для ваших параллельных прогонов. Что я говорю своему коллеге, так это выполняю все его отладки и разработки в RStudio, используя lapply()
, затем переключитесь на консоль для реального запуска.
Вот обходной путь, который использует оболочку echo
для печати на консоль R в Rstudio:
#' 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="")))
}
Просто немного расширим решение, используемое запрашивающим, то есть записываем в файл для проверки прогресса:
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'