0

我正在开发一个 R 包,并希望在后台运行正在开发的包中的一些功能,使用callr::r()callr::r_bg().

例如,我创建了一个只有一个功能的包mytest

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

然后用 加载包pkgload::load_all(),使用devtools包加载开发中的包的功能。之后,我可以在控制台中运行该功能,但不能在后台使用callr::r().

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的源代码的文件夹中。

4

1 回答 1

1

我找到了一个基于callr GitHub中的问题的解决方案。

加载包mytest后,其中仅包含hello()问题中定义的功能,devtools::load_all()以下代码有效

z <- list(mytest::hello)

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

看起来hello()加载的包中的函数load_all()不能引用mytest::hello()incallr::r()或 incallr::r_bg()而如果包是在 through 之后安装和加载的,则可以这样做library(mytest)

另一种选择可能是在 {callr} 启动的新进程中安装新包:

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

请问,是否有另一种解决方案可用于迭代新的包开发,load_all()并在 {callr} 打开的新 R 会话中使用这些包函数?

于 2021-11-29T18:11:29.570 回答