R 创建新包a时,如何修改包B的几个方法?

R 创建新包a时,如何修改包B的几个方法?,r,package,R,Package,我正在创建一个R包,我们称之为包A。这个包严重依赖于包B(可通过CRAN获得)。然而,在我的本地机器上,我对包B做了一些更改。这些更改对于a包的正确运行是必要的 A包将发布。但是,其他用户无法安装修改后的B包,他们只能安装原始的B包(通过CRAN)如何确保对包B的少量修改可供其他用户使用? 理想情况下,我只会将更改后的方法添加到包A中。但是,当我这样做时,这些方法找不到其他方法(未导出)程序包B中的函数,因为它们不包括在我的程序包A中。这样,我最终会将修改后的程序包B中的所有方法添加到我的程序包

我正在创建一个R包,我们称之为包A。这个包严重依赖于包B(可通过CRAN获得)。然而,在我的本地机器上,我对包B做了一些更改。这些更改对于a包的正确运行是必要的

A包将发布。但是,其他用户无法安装修改后的B包,他们只能安装原始的B包(通过CRAN)如何确保对包B的少量修改可供其他用户使用?


理想情况下,我只会将更改后的方法添加到包A中。但是,当我这样做时,这些方法找不到其他方法(未导出)程序包B中的函数,因为它们不包括在我的程序包A中。这样,我最终会将修改后的程序包B中的所有方法添加到我的程序包A中。这是不可取的,因为如果程序包B的作者发布更新,这些方法将不会被更新。这感觉就像是将完整的包B(包括修改)添加到我的包中。此外,它使用包B中未更改的方法污染了新的包A。

您需要依赖一种称为掩蔽的方法,当A在包B之后加载时,会首先找到包A中相同命名的函数。需要注意的是,B中的函数仍会首先找到其原始函数(未更改)。(顺便说一句,在锁定的包环境中更改对象非常困难,解锁它需要低级代码:)加载流行包时经常会出现屏蔽的好例子<例如,使用
dplyr::filter
屏蔽
stats::filter
<代码>数据。表和
dplyr
有许多共同命名的函数,包括之间的
第一个
最后一个
,因此这两个函数中的任何一个加载到第二个“赢”。另一个常见的问题是加载
plyr
dplyr
时出错,因为它们的功能偶尔会发生冲突。我认为解决这个问题的“理想”方法是,您向包B的作者提交一个pull请求(或类似机制),以便您的建议成为标准。这并不总是微不足道的,这取决于您更改的复杂性,因为维护者现在必须永远接受并维护您的想法。对于因“关于通用计算硬件和软件”而投票关闭的人,显然(对我来说)不是这样的:这是关于R的包名称空间管理的。。。特别是关于如何编码和/或维护R包,以便抢占或更新其他代码。一个问题不需要包含实际的R代码(尽管通常是这样的)才能与之相关(所以这可能是R元编程)。虽然我不知道是否能找到一个稳健而通用的解决方案,但我认为这是一个不正确的关闭理由。因此,祝你好运。@r2evans,这个问题确实与名称空间管理有关。掩蔽策略似乎是可行的,但据我所知,我无法改变另一个包的“环境”(我不确定CRAN是否喜欢)。理想的解决方案是另一个包添加功能,因为现在这不现实,所以必须找到解决方法。