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

时间:2019-07-03 18:21:12

标签: r package environment cran circos

假设一个R包( myPackage )通过描述文件和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程序包也认识到了这种特殊行为;例如,参见this程序包的第247-249行)。

不幸的是,当我只是通过 RCircos 导入 RCircos 时,似乎无法在 myPackage 中立即识别出环境 RCircos.Env 。 Description文件和NAMESPACE文件。

那该怎么办?

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

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

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

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

* 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检查会在警告中突出显示此选项,再次阻止在CRAN上接受 myPackage

* 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 可以访问 myPackage 中的RCircos.Set.Core.Components之类的功能!有人可以这样命名和解释吗?

1 个答案:

答案 0 :(得分:1)

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

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 = "redacted@redacted.com",
                  role = c("aut", "cre"))
Maintainer: Wouter van der Bijl <redacted@redacted.com>
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()完成。整个程序包可能不是您想要模仿的,但至少现在您可以将其用作依赖项。