ggsave () не работает при вызове из mclapply () в RStudio; есть ли обходной путь? - PullRequest
0 голосов
/ 03 мая 2018

Я хотел бы использовать библиотеку R «параллельный» для распараллеливания генерации некоторых графиков с использованием библиотеки «ggplot2» и столкнулся с трудностями при попытке сделать это в RStudio. В среде IDE mclapply поочередно замораживает сеанс или не запускает ggsave () для записи графика на диск (ошибки и предупреждения не выдаются). Он отлично работает в 100% случаев при работе вне RStudio. Я предполагаю, что RStudio делает что-то неприятное с графическими устройствами, но я не могу понять, что или обходной путь (я тоже пробовал png () / dev.off (), та же проблема). Вот код, который воспроизводит проблему:

library(ggplot2)
library(parallel)

mclapply(
    0:4,
    function(n) {
        df <- data.frame(x = runif(10), y = runif(10))
        p  <- ggplot(df, aes(x, y)) + geom_point()

        ggsave(
            paste0('mclapply-', n, '.png'),
            plot   = p,
            device = 'png',
            width  = 4,
            height = 4
        )

        return(n)
    }
)

Есть предложения для обхода?

РЕДАКТИРОВАТЬ: R 3.4.4 + RStudio 1.1.419 + ggplot2 2.2.1 в macOS 10.13.4; mclapply () возвращает lapply () в Windows (где это не поддерживается).

1 Ответ

0 голосов
/ 18 октября 2018

ggsave, кажется, работает во время параллельной обработки, если вы используете пакет foreach вместо mcapply:

library(foreach)

cl <- parallel::makeCluster(parallel::detectCores())
doParallel::registerDoParallel(cl)

foreach(n = 1:4, .packages = 'ggplot2') %dopar% {
   df <- data.frame(x = runif(10), y = runif(10))
   p  <- ggplot2::ggplot(df, aes(x, y)) + geom_point()

        ggplot2::ggsave(
        paste0('mclapply-', n, '.png'),
        plot   = p,
        device = 'png',
        width  = 4,
        height = 4
    )
    return(n)
}
parallel::stopCluster(cl)

Это в: macOS 10.13.6, R 3.5.1 и RStudio 1.1.453

...