Используйте функции пакета R, загруженного с помощью load_all(), в callr::r() и callr::r_bg()

Я разрабатываю пакет R и хочу запустить некоторые функции в разрабатываемом пакете в фоновом режиме, используя или callr::r_bg().

В качестве примера я создал пакет mytest только с одной функцией

      hello <- function() {
  print("Hello, world!")
}

Затем загрузил пакет с pkgload::load_all(), функция для загрузки пакета в разработке с использованием пакета devtools . После этого я могу запустить функцию в консоли, но не в фоновом режиме с помощью .

      callr::r(function(){
  mytest::hello()
})
#> Error: callr subprocess failed: there is no package called 'mytest'
#> Type .Last.error.trace to see where the error occurred

С другой стороны, если я установлю пакет и запущу library(mytest), код выше запускается без проблем

      callr::r(function(){
  mytest::hello()
})
#> [1] "Hello, world!"

Пожалуйста, подскажите, почему callr::r()не находит функции mytest::hello()?

Это выглядит как load_all()не добавляет путь к папке, в которой можно найти исходный код пакета mytest .

1 ответ

Я нашел решение, основанное на проблеме в callr GitHub.

После загрузки пакета mytest в нем есть только функция, определенная в вопросе, с devtools::load_all()следующий код работает

      z <- list(mytest::hello)

callr::r(function(z){
  z[[1]]()
}, args = list(z))
#> [1] "Hello, world!"

Похоже на функцию hello()в пакете, загруженном с, не может называться mytest::hello()в callr::r()или в callr::r_bg()в то время как вы можете сделать это, если пакет был установлен и загружен после library(mytest).

Другим вариантом может быть установка нового пакета в новый процесс, запущенный {callr}:

      callr::r(function(){
  devtools::install("./")
  mytest::hello()
})
#> [1] "Hello, world!"

Пожалуйста, есть ли другое решение, которое можно использовать для итерации разработки нового пакета с использованием load_all()и использовать эти функции пакета в новом сеансе R, открытом {callr}?

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