我正在为R编写一个包,其中导出的函数由一个高阶函数来修饰,该函数添加了错误检查和一些其他样板代码。
但是,由于此代码位于顶层,因此在解析后将对其进行评估。这意味着包文件的加载顺序很重要。
为了给出一个等价但简单的例子,假设我有一个包含两个文件(Negate2和Utils)的包,并且我要求首先加载Negate2.R,以便定义函数isfalse(),而不抛出错误。
# /Negate2.R
Negate2 <- Negate
# -------------------
# /Utils.R
istrue <- isTRUE
isfalse <- Negate2(istrue)是否可以构造名称空间、描述(排序规则)或其他包文件以更改文件的加载顺序?R封装结构和CRAN的内部工作对我来说仍然是黑魔法。
用笨拙的方法解决这个问题是可能的,但是解决这个问题的重复方式最少。包装器函数必须是高阶函数,因为它还更改了其输入函数的函数调用语义。这个包代码很重(大约6000行,100个函数),所以重复将是be...problematic。
解决方案
正如@Manetheran所指出的,要更改加载顺序,只需更改描述文件中文件名的顺序。
# /DESCRIPTION
Collate:
'Negate2.R'
'Utils.R'发布于 2013-08-27 06:30:56
Collate:文件的DESCRIPTION字段允许您更改生成包时加载的订单文件。
昨天我在Roxygen上阅读时偶然发现了这个问题的答案。如果您已经用you记录了您的函数,它可以尝试在Collate:字段中智能地排序您的Collate:源文件(基于S4类和方法定义的位置)。这可以通过向"collate"的roclets参数中添加roxygenize来实现。或者,如果您正在RStudio中开发,那么可以在Build->Configure >Configure.下检查一个简单的框。(按钮旁边是“用RO2生成文档”)。
发布于 2017-04-01 20:20:13
R按字母顺序加载文件。若要更改顺序,可以从描述文件中使用排序规则字段。
roxygen2提供了一种明确的方式,说明必须先加载一个文件,然后再加载另一个文件:@include。@include标记提供了一个以空格分隔的文件名列表,这些文件名应该在当前文件之前加载:
#' @include class-a.r
setClass("B", contains = "A")如果包中存在@include标记,roxygen2将在说明中设置排序规则字段。
为了使更改生效,您需要运行roxygen2文档的生成。
https://stackoverflow.com/questions/18441038
复制相似问题