首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在callr::r()和callr::r_bg()中使用带有load_all()的R包的函数

在callr::r()和callr::r_bg()中使用带有load_all()的R包的函数
EN

Stack Overflow用户
提问于 2021-11-27 21:39:40
回答 1查看 163关注 0票数 0

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

例如,我创建了一个只有一个函数的包mytest

代码语言:javascript
复制
hello <- function() {
  print("Hello, world!")
}

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

代码语言:javascript
复制
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),上面的代码就会顺利运行。

代码语言:javascript
复制
callr::r(function(){
  mytest::hello()
})
#> [1] "Hello, world!"

请告诉我为什么callr::r()找不到函数mytest::hello()

看起来load_all()并没有将路径添加到可以找到包mytest源代码的文件夹中。

EN

回答 1

Stack Overflow用户

发布于 2021-11-29 18:11:29

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

加载包mytest之后,该包中只包含问题中定义的函数hello(),使用devtools::load_all(),下面的代码可以工作

代码语言:javascript
复制
z <- list(mytest::hello)

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

看起来,在带有load_all()的包中,函数load_all()callr::r()中或在callr::r_bg()中不能被称为mytest::hello(),而如果包是在通过library(mytest)之后安装和加载的,则可以这样做。

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

代码语言:javascript
复制
callr::r(function(){
  devtools::install("./")
  mytest::hello()
})
#> [1] "Hello, world!"

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70138924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档