Внутренняя функция пакета R не найдена при использовании foreach с контрольной точкой - PullRequest
0 голосов
/ 02 ноября 2018

Это дополнительный вопрос к этому вопросу: Как установить .libPaths (контрольную точку) для рабочих при выполнении параллельных вычислений в R

Основываясь на ответе, я поместил следующий код (упрощенный пример) в пакет R под названием 'test1':

#' @export
f <- function() {
  `%dopar%` <- foreach::`%dopar%`
  doFuture::registerDoFuture()
  libs <- .libPaths()

  res <- foreach::foreach(x = 1:2) %dopar% {

    cat(sprintf("Initial Library paths used by worker (PID %d):\n", Sys.getpid()))
    cat(sprintf(" - %s\n", sQuote(.libPaths()[1])))

    ## Use the same library paths as the master R session
    .libPaths(libs)

    cat(sprintf("Library paths used by worker (PID %d):\n", Sys.getpid()))
    cat(sprintf(" - %s\n", sQuote(.libPaths()[1])))

    x + g()
  }

  res
}


g <- function() {
  h()
}

h <- function() {
  runif(1)
}

Затем я позвонил checkpoint::checkpoint("2018-07-24") и установил пакет в библиотеку контрольных точек. Следующий код затем выдал эту ошибку:

checkpoint::checkpoint("2018-07-24")
future::plan("multisession")
test1::f()

Исходные пути к библиотеке, используемые работником (PID 16880): - 'C: /Programme/R-3.5.1/library'

Пути к библиотекам, используемые работником (PID 16880): - '... /. контрольная точка / 2018-07-24 / lib / x86_64-w64-mingw32 / 3.5.1'

Исходные пути к библиотеке, используемые работником (PID 3916): - 'C: /Programme/R-3.5.1/library'

Пути к библиотекам, используемые работником (PID 3916): - '... /. контрольная точка / 2018-07-24 / lib / x86_64-w64-mingw32 / 3.5.1'

Ошибка в {: задача 1 не выполнена - "не удалось найти функцию" h ""

Когда я явно вызываю test1:::g() внутри вызова foreach, это работает, хотя. Может кто-нибудь объяснить, почему я должен явно вызывать функцию моего собственного пакета внутри цикла foreach с :::? Похоже, g(), кажется, найден, но h() тогда нет?

...