Подавить проверку статического кода в R (будущий пакет)

У меня есть длинный расчет, который я пытаюсь распараллелить, используя будущий пакет (в частности, в приложении Riny).

Я использовал пакет dplyr для всех манипуляций с данными, и многие имена столбцов не указаны в кавычках. Когда я пытаюсь запустить эту функцию, которая, как я знаю, работает, когда она не распараллелена, я получаю следующую ошибку:

Warning: Error in : Identified global objects via static code inspection ({if (i > maxProgress) {; maxProgress <- i; shinyWidgets::updateProgressBar(session = session, id = "pb",; value = 100 * i/length(scanList)); ...; }; return(resultInstance); }). Failed to locate global object in the relevant environments: ‘Months in Service’

потому что статическая проверка кода считает, что "Месяцы в обслуживании" является глобальной переменной и не может ее найти (на самом деле это имя столбца таблицы dplyr), поэтому он никогда не запускает мой код.

Если я делаю следующее глобально перед вызовом функции:

`Months in Service` <- NULL

это дает ту же ошибку для другого имени столбца. Поэтому одним из решений является определение каждого из этих имен как глобальных переменных, и надеюсь, что dplyr будет работать так же. Однако есть еще один простой способ обойти это, например, сказать R, чтобы он оценил все так, как это делалось бы без распараллеливания (каждая итерация полностью независима)

Редактировать 1: я упростил операцию и проверил, будет ли работать NULL. Он не будет, он будет жаловаться, потому что думает, что имя столбца NULL, например:

no applicable method for 'rename_' applied to an object of class "NULL"

Редактировать 2: пример воспроизведения

 library("dplyr")
 library("listenv")

  exampleTibb <- tibble(`col 1`=c(1,2,3))
  exampleFuture <- listenv()
  exampleFuture[[1]] %<-% future({ rename(exampleTibb, `col 2` = `col 1`) })
  exampleFuture <- as.list(exampleFuture)

1 ответ

Решение

Автор будущего пакета здесь: Это связано с ошибкой, которая была исправлена ​​в будущей версии 1.8.0. Я готовлюсь представить это в CRAN, но пока вы можете сделать:

options(future.globals.onMissing = "ignore")

или, лучше, установите версию для разработчиков:

remotes::install_github("HenrikBengtsson/future@develop")

ОБНОВЛЕНИЕ 2018-04-08: будущее 1.8.0 теперь на CRAN.


ОБНОВЛЕНИЕ 2018-04-07: Эта ошибка возникает только при использовании вложенных фьючерсов. Обратите внимание, что вы вводите вложенные фьючерсы по ошибке, когда используете оба %<-% а также future(), Это явно ошибка. Вы хотите использовать, либо:

exampleFuture[[1]] %<-% { rename(exampleTibb, `col 2` = `col 1`) }

или же

exampleFuture[[1]] <- future({ rename(exampleTibb, `col 2` = `col 1`) })

и, конечно, не оба.

Другие вопросы по тегам