Используйте функции пакета 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}?