我正在构建一个包含大量内部数据的新R包。我决定将软件包分成两部分:A(包含源代码)和B(包含数据)。这符合官方CRAN政策。数据至关重要,如果没有它,包装就无法运作。
我无法从A中的源代码链接到B中的数据.A中的所有源代码都在目录R/
中,B中的所有数据都在目录data/
中。我们假设dat
是B中唯一的数据文件。我尝试了以下内容:
在B的LazyData: true
文件中启用DESCRIPTION
,这将导出数据文件。在A中,我通过B::dat
访问源代码中的数据。问题:R CMD check
提出了一个注释:B::dat
尚未定义,CRAN维护者声称这是不好的做法。
将B中的所有数据保存到sysdata.rda
目录中的R/
并使用来自A的B:::dat
引用它。问题:CRAN维护者声称这是不好的做法,因为所有数据应位于data/
,而不是R/
。此外,这样您就无法在man/
中记录数据文件。
使用NAMESPACE
命令无法使用export(dat)
文件导出B中的数据。
data(dat,package="B")
加载数据但加载到全局环境中,但作为内部数据,用户不应该看到它,因此这不起作用。
data(dat,package="B",envir=environment())
将数据加载到函数调用的本地环境中,但每次调用函数时(这可能会多次),加载数据也需要很长时间才能进行计算慢。我也尝试直接加载到包命名空间,但这些命名空间被锁定,这是不允许的。我们如何才能将数据直接加载到包命名空间中?
有关如何解决这个问题的任何建议?这样做的正确方法是什么?理想情况下,数据位于包B中的data/
目录中,包A中的源代码在访问它时没有任何问题。谢谢!
答案 0 :(得分:1)
一个非常简单的解决方案:
在包A的DESCRIPTION
文件中,它应包含Depends: B
。我发现使用Imports: B
将不用于导入数据文件,除非它们位于sysdata.rda
中。此外,软件包B的NAMESPACE
文件默认情况下应包含以下内容:
exportPattern(".")
这样,您可以直接在包A中的任何源代码中引用dat
。
答案 1 :(得分:0)