9

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

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

举一个等效但简化的示例,假设我有一个包含两个文件(Negate2 和 Utils)的包,并且我需要首先加载 Negate2.R 才能定义函数“isfalse( )”而不会引发错误。

# /Negate2.R
Negate2 <- Negate

# -------------------

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

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

可以使用笨拙的技巧来解决此问题,但这是解决此问题的重复性最少的方法。包装函数必须是高阶函数,因为它还改变了其输入函数的函数调用语义。该包代码繁重(约 6000 行,100 个函数),因此重复将是……有问题的。

解决方案

正如@Manetheran 指出的那样,要更改加载顺序,您只需更改DESCRIPTION 文件中文件名的顺序。

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

2 回答 2

9

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

我昨天在阅读时偶然发现了这个问题的答案Roxygen。如果您一直在使用 Roxygen 记录您的函数,它可以尝试R在字段中智能地排序您的源文件Collate:(基于 S4 类和方法定义的位置)。这可以通过添加"collate"roclets参数来完成roxygenize。或者,如果您正在开发RStudio,可以在 Build->Configure Build Tools->Configure... 下选中一个简单的框(“使用 Roxygen 生成文档”旁边的按钮)。

于 2013-08-27T06:30:56.700 回答
1

R 按字母顺序加载文件。要更改顺序,可以使用说明文件中的整理字段。

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

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

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

您需要运行生成 roxygen2 文档才能使更改生效。

于 2017-04-01T20:20:13.623 回答