R软件包-从导入的软件包转移环境

迈克尔·G

假设一个R包(myPackage通过DESCRIPTION文件和NAMESPACE文件导入R包RCircos

$ cat DESCRIPTION
Package: myPackage
Imports: RCircos (>= 1.2.0)
...

$ cat NAMESPACE
import(RCircos)
...

其中的额外补贴RCircos是,它定义了一个自定义的环境(称为RCircos.Env)和读/写变量从不同的职能这种环境。例如,函数RCircos.Initialize.Plot.Parameters对此环境进行读写。

...
RCircosEnvironment <- NULL;
RCircosEnvironment <- get("RCircos.Env", envir = globalenv());
RCircosEnvironment[["RCircos.PlotPar"]] <- plot.param;

(这种特殊的行为也已被其他R程序包所识别;例如,参见程序包的247-249行)。

不幸的是,当我仅通过DESCRIPTION文件和NAMESPACE文件导入RCircos,似乎无法在myPackage立即识别环境RCircos.Env

那该怎么办呢?

似乎有两种选择可以使环境RCircos.Env可以访问RCircos.Initialize.Plot.Parameters但是,这两个选项都会导致CRAN check(R CMD check myPackage --as-cran)在myPackage提交给CRAN之前对myPackage进行强制评估期间发出警告或注释,从而阻止了它在CRAN上的接受。

选项1:我在函数要求对象之前添加以下行:

# my code here #
assign("RCircos.Env", RCircos::RCircos.Env, .GlobalEnv)
RCircos.Set.Core.Components(...)
# my code here #

但是,CRAN检查用“ NOTE”突出显示了这一行,从而阻止了myPackage在CRAN上的接受

* checking R code for possible problems ... NOTE
Found the following assignments to the global environment:
File ‘PACViR/R/visualizeWithRCircos.R’:
  assign("RCircos.Env", RCircos::RCircos.Env, .GlobalEnv)

选项2在功能要求对象之前,我先加载整个RCircos库:

# my code here #
library(RCircos)
RCircos.Set.Core.Components(...)
# my code here #

但是,CRAN检查会以警告突出显示此选项,再次阻止了myPackage在CRAN上的接受

* checking dependencies in R code ... WARNING
'library' or 'require' call not declared from: ‘RCircos’
'library' or 'require' call to ‘RCircos’ in package code.
  Please use :: or requireNamespace() instead.
  See section 'Suggested packages' in the 'Writing R Extensions' manual.

当然,必须有使环境的容易和CRAN兼容的方式RCircos.Env等功能的访问RCircos.Set.Core.Componentsmypackage的有人可以这样命名和解释吗?

阿克斯曼

显然,正常的重新导出不适用于环境,而不适用于功能。但这确实有效:

RCircos.Env <- RCircos::RCircos.Env

#' test
#'
#' @param ... data
#'
#' @export
test_fun <- function(...) {
  RCircos::RCircos.Set.Core.Components(...)
}

DESCRIPTION

Package: test
Type: Package
Title: test
Description: This is a description.
Version: 0.1.0
Authors@R: person("Wouter", "van der Bijl",
                  email = "[email protected]",
                  role = c("aut", "cre"))
Maintainer: Wouter van der Bijl <[email protected]>
License: GPL-3
Encoding: UTF-8
LazyData: true
Imports: RCircos
RoxygenNote: 6.1.1

NAMESPACE

# Generated by roxygen2: do not edit by hand

export(test_fun)

测试:

library(test)
data(UCSC.HG19.Human.CytoBandIdeogram, package = 'RCircos')
test_fun(UCSC.HG19.Human.CytoBandIdeogram)

基本上,当RCircos运行时get("RCircos.Env", envir = globalenv()),它将遍历搜索路径,直到RCircos.Env从包中找到为止

运行R CMD Check时,我得到0个错误,0个警告,0个注释。


请注意,这种RCircos使用带有被使用查找的环境的策略get(.., envir = globalenv())确实是非正统的,通常不是一个好主意。R函数通常不应有副作用,例如编辑看不见的环境。通常使用来设置默认值等options()整个软件包可能不是您想要模仿的东西,但是至少现在您可以将其用作依赖项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章