По сути, добавив еще один вариант @ fotNelson-й решения, но с некоторыми изменениями:
- Падением в замене для mclapply (поддерживает все функции mclapply)
- уловов Ctrl-C звонки и прекращает грациозно
- использует встроенную (txtProgressBar)
- возможность отслеживать прогресс или нет и использовать указанный стиль индикатора выполнения
- скорее всего использует
parallel
чем multicore
который теперь был удален из CRAN
- X принуждает к списку согласно mclapply (так длина (X) дает ожидаемые результаты)
- roxygen2 стиль документация в верхнем
Надеется, что это поможет кому-то .. ,
library(parallel)
#-------------------------------------------------------------------------------
#' Wrapper around mclapply to track progress
#'
#' Based on http://stackoverflow.com/questions/10984556
#'
#' @param X a vector (atomic or list) or an expressions vector. Other
#' objects (including classed objects) will be coerced by
#' ‘as.list’
#' @param FUN the function to be applied to
#' @param ... optional arguments to ‘FUN’
#' @param mc.preschedule see mclapply
#' @param mc.set.seed see mclapply
#' @param mc.silent see mclapply
#' @param mc.cores see mclapply
#' @param mc.cleanup see mclapply
#' @param mc.allow.recursive see mclapply
#' @param mc.progress track progress?
#' @param mc.style style of progress bar (see txtProgressBar)
#'
#' @examples
#' x <- mclapply2(1:1000, function(i, y) Sys.sleep(0.01))
#' x <- mclapply2(1:3, function(i, y) Sys.sleep(1), mc.cores=1)
#'
#' dat <- lapply(1:10, function(x) rnorm(100))
#' func <- function(x, arg1) mean(x)/arg1
#' mclapply2(dat, func, arg1=10, mc.cores=2)
#-------------------------------------------------------------------------------
mclapply2 <- function(X, FUN, ...,
mc.preschedule = TRUE, mc.set.seed = TRUE,
mc.silent = FALSE, mc.cores = getOption("mc.cores", 2L),
mc.cleanup = TRUE, mc.allow.recursive = TRUE,
mc.progress=TRUE, mc.style=3)
{
if (!is.vector(X) || is.object(X)) X <- as.list(X)
if (mc.progress) {
f <- fifo(tempfile(), open="w+b", blocking=T)
p <- parallel:::mcfork()
pb <- txtProgressBar(0, length(X), style=mc.style)
setTxtProgressBar(pb, 0)
progress <- 0
if (inherits(p, "masterProcess")) {
while (progress < length(X)) {
readBin(f, "double")
progress <- progress + 1
setTxtProgressBar(pb, progress)
}
cat("\n")
parallel:::mcexit()
}
}
tryCatch({
result <- mclapply(X, ..., function(...) {
res <- FUN(...)
if (mc.progress) writeBin(1, f)
res
},
mc.preschedule = mc.preschedule, mc.set.seed = mc.set.seed,
mc.silent = mc.silent, mc.cores = mc.cores,
mc.cleanup = mc.cleanup, mc.allow.recursive = mc.allow.recursive
)
}, finally = {
if (mc.progress) close(f)
})
result
}
См. Мой ответ на аналогичный вопрос: http://stackoverflow.com/a/5431265/653825 – otsaw
Отличный ответ здесь @fotNelton и другие, основанные на его повторном использовании. В качестве быстрого решения увидеть прогресс в одноразовых вызовах «mclapply» вы также можете просто «cat (». »)' В рабочей функции. – codeola
Отличный вопрос, 'package multicore' больше недоступен, есть ли обходной путь без пакета' multicore'? – forecaster