R:从包A中的源代码链接到包B中的数据

时间:2014-01-08 20:04:06

标签: r package

我正在构建一个包含大量内部数据的新R包。我决定将软件包分成两部分:A(包含源代码)和B(包含数据)。这符合官方CRAN政策。数据至关重要,如果没有它,包装就无法运作。

我无法从A中的源代码链接到B中的数据.A中的所有源代码都在目录R/中,B中的所有数据都在目录data/中。我们假设dat是B中唯一的数据文件。我尝试了以下内容:

  1. 在B的LazyData: true文件中启用DESCRIPTION,这将导出数据文件。在A中,我通过B::dat访问源代码中的数据。问题:R CMD check提出了一个注释:B::dat尚未定义,CRAN维护者声称这是不好的做法。

  2. 将B中的所有数据保存到sysdata.rda目录中的R/并使用来自A的B:::dat引用它。问题:CRAN维护者声称这是不好的做法,因为所有数据应位于data/,而不是R/。此外,这样您就无法在man/中记录数据文件。

  3. 使用NAMESPACE命令无法使用export(dat)文件导出B中的数据。

  4. data(dat,package="B")加载数据但加载到全局环境中,但作为内部数据,用户不应该看到它,因此这不起作用。

  5. data(dat,package="B",envir=environment())将数据加载到函数调用的本地环境中,但每次调用函数时(这可能会多次),加载数据也需要很长时间才能进行计算慢。我也尝试直接加载到包命名空间,但这些命名空间被锁定,这是不允许的。我们如何才能将数据直接加载到包命名空间中?

  6. 有关如何解决这个问题的任何建议?这样做的正确方法是什么?理想情况下,数据位于包B中的data/目录中,包A中的源代码在访问它时没有任何问题。谢谢!

2 个答案:

答案 0 :(得分:1)

一个非常简单的解决方案:

在包A的DESCRIPTION文件中,它应包含Depends: B。我发现使用Imports: B用于导入数据文件,除非它们位于sysdata.rda中。此外,软件包B的NAMESPACE文件默认情况下应包含以下内容:

exportPattern(".")

这样,您可以直接在包A中的任何源代码中引用dat

答案 1 :(得分:0)

为什么不保持简单明了:data(someData, package="A")

让它神奇地工作(就像数据来自同一个包时一样)是可能的;有一些软件包(例如SOAR)通过延迟加载和按需加载来制作技巧。

编辑:来考虑一下,CRAN上有很多数据包。你研究过那些吗?例如,TH.data由Torsten设置用于包。这不是你的用例吗?也许你会在它的设置中找到相关的技巧。