Внутренняя функция пакета R не найдена при использовании foreach с контрольной точкой
Это дополнительный вопрос этого вопроса: Как установить.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): - '.../. Checkpoint/2018-07-24/lib/x86_64-w64-mingw32/3.5.1'
Начальные пути к библиотеке, используемые работником (PID 3916): - 'C:/Programme/R-3.5.1/library'
Пути к библиотекам, используемые работником (PID 3916): - '.../. Checkpoint/2018-07-24/lib/x86_64-w64-mingw32/3.5.1'
Ошибка в {: задача 1 не выполнена - "не удалось найти функцию"h""
Когда я явно звоню test1:::g()
внутри foreach
позвоните, это работает, хотя. Может кто-нибудь объяснить, почему я должен явно вызывать функцию моего собственного пакета внутри цикла foreach с :::
? Это выглядит как g()
кажется, найден, но h()
тогда нет?