【问题标题】:R package which imports SparkR (not on CRAN)导入 SparkR 的 R 包(不在 CRAN 上)
【发布时间】:2026-02-19 13:15:02
【问题描述】:

这个问题与this有关:当你在写一个包时,如何在一个不在CRAN上的现有R包上指定一个依赖项(在ImportsDepends中)。

我正在编写一个导入 SparkR 的 R 包,它不再在 CRAN 中(它在 R 文件夹中随 Spark 一起交付)。我尝试在我的DESCRIPTION 文件的Additional_repositories 字段中添加指向http://github.com/apache/spark/tree/master/R/pkg 的GitHub 链接,但没有运气,因为R CMD 命令(安装、检查等)一直抱怨找不到SparkRin this post 讨论了同样的问题。就我而言,我的包也严重依赖 SparkR 将其移动到 Suggests

您能否建议一种适当的方法来解决此问题,而不是仅仅假设 SparkR 文件夹已存在于用户的 R 库文件夹中。

谢谢

【问题讨论】:

    标签: r sparkr r-package


    【解决方案1】:

    两个选项: 1. 向用户说明如何安装这个特定的包(见帮助(install.packages)——一旦你知道了路径,它就是一行) 2. 运行你自己的仓库。包 drat 可帮助您在 github 上运行自己的 repo。

    【讨论】:

    • 感谢您的回答。 W.r.t 第二个选项,我想我不明白为什么这会解决问题......我仍然需要在DESCRIPTION 文件中指定一些东西 - 无论是火花回购还是我的 - 对吧?然后我会遇到同样的问题。我在考虑 URL 中的错误或其他问题 - 可能是因为 Spark 存储库中没有“SparkR”文件夹(R 包结构本身从“pkg”文件夹开始)?
    • 您只需要告诉用户直接将您的 repo 添加到“repos”选项中,就像在 install.packages 的 repos 参数中一样。我认为您应该停止考虑更改DESCRIPTION文件,因为没有什么可以帮助解决这个问题。在这种情况下,我不知道如何让“install.packages”默认工作。
    【解决方案2】:

    假设您的用户已经安装了 SparkR,这有什么问题?如果他们正在使用 Spark,那么他们已经拥有它(因为你说它是 Spark 附带的)。如果他们不使用 Spark,那么他们就不需要它(并且可能他们也不需要你的包)。如果有问题,请在文档中的某处添加有关安装 SparkR 的消息。

    如果您只想从 SparkR 中获得一个在 Spark 之外有用的函数,那么只需将其复制到您自己的代码中(并注明来源)。 SparkR 是Apache licensed,所以你可以这样做。或者如果你不想复制,那就自己写吧。

    【讨论】:

    • 你是对的,问题是在 Spark 主目录中安装 SparkR 是不够的,但需要将 SparkR 文件夹复制到 R 包所在的位置之一(要么在个人库文件夹 /R 或 /usr/lib/R/library 或 /usr/lib64/R/library 中)。否则,R CMD 命令(以及几乎所有检查)会抱怨,因为它们不会找到在Imports 字段中声明的 SparkR 依赖关系。我认为会有一些优雅的方式来指定依赖项,只使用 DESCRIPTION 文件。
    • 我想现在我理解了第二个选项:创建一个类似 CRAN 的存储库并使用它来指定依赖项。我不确定这是否适用于 DEPENDENCIES 字段,因为它不适用于 GitHub,但我会试一试。谢谢你们!
    • @Pablo 如果有人想使用 SparkR,无论如何他们都必须复制该文件夹。
    • 记录行为是必经之路 (+1)。复制 SparkR 代码没有意义。 SparkR 不仅不是一个独立的包,而且它与 Spark 二进制文件紧密绑定。您不能简单地假设 internal API 在版本之间是兼容的,并且在集群上要求特定版本的 Spark 是不现实的。更不用说 Spark 必须使用 SparkR 支持构建,并且集群中的每台机器都需要 R 解释器。