更改R包中文件的加载顺序



我正在为R编写一个包,其中导出的函数由一个高阶函数修饰,该函数添加了错误检查和其他一些样板代码。

但是,由于此代码位于顶层,因此在解析后会对其进行评估。这意味着包文件的加载顺序很重要。

为了给出一个等效但简化的示例,假设我有一个包含两个文件(Negate2和Utils)的包,并且我要求首先加载Negate2.R,以便在不引发错误的情况下定义函数"isfalse()"。

# /Negate2.R
Negate2 <- Negate
# -------------------
# /Utils.R
istrue <- isTRUE
isfalse <- Negate2(istrue)

是否可以构造NAMESPACE、DESCRIPTION(collate)或其他包文件来更改文件的加载顺序?R封装结构和CRAN的内部工作对我来说仍然是黑魔法

使用笨拙的技巧来解决这个问题是可能的,但这是解决这个问题最不重复的方法。包装函数必须是一个高阶函数,因为它还会更改其输入函数的函数调用语义。这个程序包代码量很大(大约6000行,100个函数),所以重复会……有问题

解决方案

正如@Manetheran所指出的,要更改加载顺序,只需更改DESCRIPTION文件中文件名的顺序即可。

# /DESCRIPTION
Collate:
    'Negate2.R'
    'Utils.R'

DESCRIPTION文件的Collate:字段允许您更改在构建包时加载的顺序文件。

昨天我在读Roxygen时偶然发现了这个问题的答案。如果您一直在用Roxygen记录您的函数,它可以尝试在Collate:字段中智能地排序R源文件(基于S4类和方法定义的位置)。这可以通过将"collate"添加到roxygenizeroclets自变量来实现。或者,如果您在RStudio中进行开发,则可以在"构建"->"配置构建工具"->"设置…"下选中一个简单的框。。。("使用Roxygen生成文档"旁边的按钮)。

R按字母顺序加载文件。要更改顺序,可以使用DESCRIPTION文件中的"排序规则"字段。

roxygen2提供了一种明确的方式来表示必须先加载一个文件,然后再加载另一个文件:@include。@include标记提供了一个以空格分隔的文件名列表,该列表应在当前文件之前加载:

#' @include class-a.r
setClass("B", contains = "A")

如果包中存在任何@include标记,roxygen2将在DESCRIPTION中设置Collate字段。

您需要运行roxygen2文档的生成,以便更改生效。

最新更新