【问题标题】:R: Linking to data in package B from source code in package AR:从包A中的源代码链接到包B中的数据
【发布时间】:2014-01-08 20:04:05
【问题描述】:

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

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

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

  2. 将 B 中的所有数据保存到 R/ 目录中的 sysdata.rda 中,并使用 A 中的 B:::dat 引用它。问题:CRAN 维护人员声称这是一种不好的做法,因为所有数据都应该在 @987654332 中@,不在R/ 中。此外,这样您就无法在man/ 中记录数据文件。

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

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

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

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

【问题讨论】:

    标签: r package


    【解决方案1】:

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

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

    exportPattern(".")
    

    这样你就可以在包A的任意源码中直接引用dat了。

    【讨论】:

      【解决方案2】:

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

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

      编辑: 想想看,CRAN 上有很多 data 包。你学过那些吗?例如,TH.data 由 Torsten 设置用于 is 包。这不是你的用例吗?也许你会在它的设置中找到相关的技巧。

      【讨论】:

      • 谢谢,我采纳了您的解决方案,但效果不佳。请参阅上面已编辑的问题。
      • 感谢您指出仅数据包的示例。从那里得到了答案。它现在可以完美运行,令人惊讶的是数据包需要依赖,而不是导入
      • 取决于: 更改您想要的搜索路径。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2022-01-18
      • 2021-01-16
      • 2017-05-24
      • 1970-01-01
      相关资源
      最近更新 更多