假设一个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
之类的功能!有人可以这样命名和解释吗?
答案 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()
完成。整个程序包可能不是您想要模仿的,但至少现在您可以将其用作依赖项。