假设一个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.Components
中mypackage的!有人可以这样命名和解释吗?
显然,正常的重新导出不适用于环境,而不适用于功能。但这确实有效:
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] 删除。
我来说两句