首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >暂时忽略R中的某些库

暂时忽略R中的某些库
EN

Stack Overflow用户
提问于 2019-04-18 13:15:29
回答 2查看 375关注 0票数 1

我目前正在为我们公司开发的R软件包进行持续的集成设置。每个R包有一个Jenkins项目,每个项目有相应的库。

我已经定义了一个逻辑,它将包的所有依赖项安装到项目库中。现在我想定义一个基本运行的检查阶段

代码语言:javascript
复制
devtools::check("${PROJECT_DIR}/pkg")

但只对依赖项使用项目库。我尝试以以下方式使用callr包。

代码语言:javascript
复制
callr::r(
  function(...) {
    devtools::check(...)
  ),
  args = list("${PROJECT_DIR}/pkg"),
  libpath = "${PROJECT_DIR}/lib"
)

但是,检查过程仍然能够找到没有安装在libpath中的包。是否有方法确保在构建阶段只使用"${PROJECT_DIR}/lib"

到目前为止,我已经尝试了以下几种方法,但都没有用

  • 带有callr()参数的libpath
  • 带有withr::with_libpaths参数的new
  • 查看devtools::checkR CMD BUILD中的文档以获得适当的参数
  • 使用.libPaths("${JOB_DIR}/lib")

这里有一个重复来解释callr的意外行为。我希望在第3行中出现错误。

代码语言:javascript
复制
find.package("ggplot2", .libPaths()[1])
#> Error in find.package("ggplot2", .libPaths()[1]): there is no package called 'ggplot2'
callr::r(function() {  ggplot2::vars() }, libpath = .libPaths()[1])
#> named list()
find.package("ggplot2", .libPaths()[2])
#> [1] "/data/R/3.5.3/lib/R/library/ggplot2"
callr::r(function() {  ggplot2::vars() }, libpath = .libPaths()[2])
#> named list()
EN

回答 2

Stack Overflow用户

发布于 2019-04-18 14:07:11

按照这个问题编码,有一种方法可以用base::assign将其归档。如果有更合适的解决办法,我很想听听。

代码语言:javascript
复制
callr::r(function() {
  assign(".lib.loc", .libPaths()[1], envir = environment(.libPaths))
  ggplot2::vars() 
})
#> Error in loadNamespace(name): there is no package called ‘ggplot2’

我在这里的问题有两个

  1. 这基本上是一次黑客攻击,如果.libPaths()的内部结构发生变化,随时都可以破坏。
  2. 我可能还必须修改.Library.Library.site (.libPaths()的内部结构),以确保devtools::check受到适当的影响。
票数 1
EN

Stack Overflow用户

发布于 2019-04-19 15:01:26

这可能有点偏离主题,但是您考虑过在这个用例中使用docker吗?

您可以定义在Dockerfile中引用的Jenkinsfile,它将为运行的每个CI作业定义一个自定义映像。使用Jenkins中的devtools::install(),将包安装到坞容器上。当CI完成时,这个容器就会被抛出。

使用这种方法,您不必担心在运行CI时手动安装包,也不必担心不同包之间的名称空间冲突。

这肯定有一个较高的启动成本,但我认为你会发现,这将是值得的长期测试你的R包。资料来源:我也在我的工作中测试内部R包。

样本Dockerfile

代码语言:javascript
复制
FROM docker.io/rocker/r-base

USER root

# Install packages needed for package development
RUN R -e 'install.packages(c("devtools", "rmarkdown", "testthat", "roxygen2"))'

然后在Dockerfile中引用此Jenkinsfile,以便安装、测试和检查包(下面的管道示例)

代码语言:javascript
复制
    agent {
        dockerfile {
            args '-u root'
        }
    }
    stages {
        stage('Install') {
            steps {
                sh 'r -e "devtools::install()"'
            }
        }
        stage('Test') {
            steps {
                sh '''
                  r -e "options(testthat.output_file = 'test-out.xml'); devtools::test(reporter = 'junit')"
                '''
                junit 'test-out.xml'
            }
        }
        stage('Check') {
           // Might need to modify expected ouput, depends on devtools version
            steps {
                sh '''
                  testOutput=$(R -e "devtools::check(args='--no-tests')" 2>&1)
                  echo "${testOutput}" | grep -q "0 errors ✔ | 0 warnings ✔ | 0 notes ✔"
                '''
            }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55746843

复制
相关文章

相似问题

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