【问题标题】:Questions about R package publishing and code visibility关于 R 包发布和代码可见性的问题
【发布时间】:2020-09-11 00:04:51
【问题描述】:

当我在 R 中使用一个包时,我会安装它并在加载它时使用它。现在如果我添加一个使用另一个包的包怎么办?这个包是否也自动下载和加载?还是一般禁止 R 包使用另一个包?我不这么认为。

假设我想发布一个 R 包。在我的代码中,我可以使用其他包中的函数并安装和加载这些包吗?或者当我需要其他包的功能时,它是如何工作的?我是否必须实现一个消息,表明需要这个和那个包,并且用户必须在它之前安装和加载它,并且我需要实现错误捕获功能,以防在 pc 系统上找不到包?

当我想发布一个 R 包时,我可以在我的包/代码中使用/调用 Java 代码吗?

对于一个已经发布的包 - 所以让我们以 fGarch 包为例 - 我想看看完整的代码。我怎么能看到这个?我知道 R 是开源的,我认为输入一个空函数并显示代码或多或少是可能的,但有时这不起作用,尤其是我的问题是:有没有办法可以查看整个包的代码?

对于已经发布的包,是否可以查看和查看所有提交的文件?因此,就像 git 一样的存储库,所有文件都在其中提交 - 代码本身和需要的其他文件,如描述文件或其他文件 - 我可以看到这些文件并查看它们?

关于this post here 和隐藏功能的更多信息:R 包中是否有我作为最终用户看不到的代码?这也指的是我之前的问题,我如何或通过哪种方式可以看到 R 包中的整个代码?

【问题讨论】:

  • 您似乎想认真地制作一个包!你可以看看这里:r-pkgs.had.co.nz(这在创建我的第一个包时帮助了我很多)
  • (1) “Java 代码”,参见rJava。 (2)“查看完整代码”:我经常去github.com/cran查看各个包的源代码,很多包都列出了他们的github/gitlab/r-forge repo他们的 CRAN 包页面。 (3) "code ... which I't see" 通常是 S4 和 R6 OOP 代码的问题,当然还有编译后的代码(C、C++、Rcpp),但如果如果您担心隐藏专有代码,那么 R 可能不是您的答案。

标签: r package cran


【解决方案1】:

我猜你在这里有几个不同的问题。让我们按照您要求的顺序来处理它们:

如果我添加一个使用另一个包的包怎么办?这个包是否也自动下载和加载?还是一般禁止 R 包使用另一个包?

当然不禁止一个 R 包使用另一个 R 包。事实上,大多数 R 包依赖其他包。

每个 R 包的源代码必须在根目录中包含一个基于文本的 DESCRIPTION 文件。在此文件中,您将找到(除其他外)一个“Depends”字段和一个“Imports”字段。这两个字段一起列出了使用 this 包的所有其他包必需。如果用户还没有在他们的本地库中安装这些其他包,R 将在安装请求的包时自动安装它们。

如果你的包在“Depends”中列出了一个依赖项,那么每当你的包被附加时,依赖包就会被附加。因此,如果您查看名为“foo”的包的源代码,您会发现它的 DESCRIPTION 文件包含以下行

Depends: bar,

您知道,当您在 R 控制台中调用 library(foo) 时,您实际上已经完成了 library(bar); library(foo)

这并不总是理想的。包foo 可能只需要包bar 中的几个函数,而bar 可能包含一些其他函数,其名称可能与其他常用函数发生冲突。因此,一般来说,如果您正在编写一个包并且只想使用另一个包中的几个函数,那么最好使用“Imports”而不是“Depends”来限制添加到用户的不必要符号的数量搜索路径。


假设我想发布一个 R 包。在我的代码中,我可以使用其他包中的函数并安装和加载这些包吗

是的,您可以使用其他软件包中的功能。最简单的方法是在 DESCRIPTION 文件的 Depends 字段中包含包的名称。

但是,当在您自己的包中仅使用来自另一个包的几个函数时,最佳做法是使用 DESCRIPTION 文件中的“Imports”字段,并在您的实际 R 代码中为导入的函数使用命名空间限定符.例如,如果您想使用 ggplot2 包中的 ggplot,那么在您的函数中,您可以将其命名为 ggplot2::ggplot 而不仅仅是 ggplot

如果你发布你的包供其他人使用,如果用户使用默认设置调用install.packages,依赖项将与你的包一起自动安装。例如,当我这样做时:

install.packages("fGarch")

我收到了相关消息:

#> also installing the dependencies ‘timeSeries’, ‘fBasics’, ‘fastICA’

我是否必须实现一个消息,表明需要这个和那个包,并且用户必须在它之前安装和加载它,并且我需要实现错误捕获功能,以防在电脑系统?

不,一般来说不是。只要您在 DESCRIPTION 文件中列出了正确的包,R 就会处理这个问题。


当我想发布一个 R 包时,我可以在我的包/代码中使用/调用 Java 代码吗?

R 没有本机 Java API,但您可以通过 rJava package 使用自己的 Java 代码,您可以将其列为包的依赖项。但是,有一些用户很难让 Java 运行,例如商业和学术用户,他们可能使用 R 但没有安装 Java 并且没有安装它的管理员权限,所以在编写时要牢记这一点一个包。


对于一个已经发布的包 - 所以让我们以 fGarch 包为例 - 我想看看完整的代码。我怎么能看到这个?

可从 CRAN 下载的每个软件包都有可用的源代码。对于fGarch,它的CRAN page 包含一个指向源代码压缩包的链接。你可以下载这个并在 R 中使用untar 来查看所有源代码。或者,许多包将在 Github 或其他源代码控制站点上有一个很容易找到的存储库,您可以在其中通过浏览器检查源代码。例如,您可以在 Github here 上浏览 fGarch 源代码。


对于已经发布的包,是否可以查看和查看所有提交的文件?因此,就像提交所有文件的 git 存储库一样 - 代码本身和所需的其他文件,如描述文件或其他文件 - 我可以看到这些文件并查看它们?

是的,您可以在非官方的 Github CRAN 镜像here 上查看上传到 Github 上 CRAN 的所有包的所有源文件@


R 包中是否有我不能作为最终用户看到的代码?这也指的是我之前的问题,我如何或通过哪种方式可以看到 R 包中的整个代码?

如上所述,您可以通过 CRAN 或 Github 获取任何包的源代码。正如您所说,您只需在 R 中输入函数的名称即可查看 exported 函数的源代码。对于未导出的函数,您可以使用三个冒号执行相同操作。例如,ggplot2:::adjust_breaks 允许您从ggplot2 中查看未导出函数adjust_breaks 的函数体。当使用像 S4、ggproto 或 R6 这样的面向对象系统时,或者当源代码包含已编译的 C 或 C++ 代码时,会有一些复杂性,但我还没有遇到我无法找到的情况使用 R 控制台和良好的搜索引擎在一两分钟后获得相关源代码。

【讨论】:

  • 您向Depends 添加依赖项的建议不加选择地违背了大多数人认为的最佳实践(例如kbroman.org/pkg_primer/pages/depends.htmlr-pkgs.had.co.nz/description.html#dependenciesstackoverflow.com/a/8638902/8386140)。在可行的情况下将它们添加到Imports 中更好,b/c 会导致加载包时加载的包更少,而 b/c 在确保按预期调用正确版本的函数方面更安全。这个问题实际上可能很复杂,但至少可以通过对这个问题的认可来改进答案
  • 你当然是对的@duckmayr。 OP 显然在包开发中迈出了前几步,我经常因为试图让答案过于简单(只要它有效)而感到内疚,因为细微差别可能会使答案变得复杂得令人不快新手。另一方面,我不想灌输草率的做法。我会看看我是否能找到一种方法来解决这个问题而不会过于复杂。感谢您抽出宝贵时间提供反馈 - 非常感谢。
  • 别担心!这已经是一个非常详细的答案,而且你肯定是对的,只有这么多的细节可以进入 Stack Overflow 的答案,而太多的细节可能会让新手感到反感。祝你取得正确的平衡,我只是想提出这个问题。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2023-03-23
  • 2021-06-21
  • 2019-08-17
相关资源
最近更新 更多