繁体   English   中英

R:如何在包中添加额外的功能?

[英]R: How do I add an extra function to a package?

我想将一个特殊修改的函数添加到其他人编写的包中,使用R脚本,即仅用于会话,而不是永久性的。 具体的例子是, bls_map_county2()添加到blscrapeR包中。 bls_map_county2只是带有添加的...参数的bls_map_county()函数的副本,用于更改一些地图绘制参数。 我还没有插入其他参数。 按原样运行函数,我收到错误:

BLS_map_county出错(map_data = df,fill_rate =“unemployed_rate”,:找不到函数“geom_map”

我假设这是因为我的函数没有指向blscrapeR命名空间。 如何将我的函数分配给(已安装,加载)的blscrapeR命名空间,还有什么我需要做的让它从它需要的包中访问任何机器吗?

当我攻击特定包中的某个函数时,该函数又调用其他函数,我经常在定义后使用此表单:

mof_func <- function( args) {body hacked}
environment(mod_func) <- environment(old_func)

但我认为您可能真正想要的功能是assignInNamespace 这些方法将允许访问已加载包中的非导出函数。 但是,如果未加载包,它们将不会成功。 因此,您可能希望对require(pkgname)进行stopifnot()检查。

这个答案有两个部分 - 首先是你问题的通用答案,第二个是你引用的特定功能的具体答案,其中问题略有不同。

1)编辑包函数时访问内部函数的通用解决方案

您应该已经可以访问包名称空间,因为您加载了它,因此只有未导出的函数会给您带来问题。

我通常只使用:::运算符将包名称添加到非导出函数中。 即,找到对some_internal_function()每个调用实例,并将其替换为PackageName:::some_internal_function() 如果在您正在编辑的函数中调用了几个不同的内部函数,则可能需要对每个有问题的函数调用执行此操作几次。

:::的帮助页面确实包含这些警告

注意 - 使用':::'需要您自担风险!

在您的代码中使用:::通常是一个设计错误,因为相应的对象可能已经保留在内部,这是有充分理由的。 如果您觉得除了检查之外需要访问对象,请考虑联系软件包维护人员。

但是对于你正在做的事情,就从同一个软件包暂时攻击你自己使用的另一个功能而言,这些警告应该是安全的,可以忽略(当然你自己承担风险 - 如手册中所述)

2)在blscrapeR ::bls_map_county()的情况下

在这种情况下,违规行是

ggplot2::ggplot() + geom_map(...

其中包编写者为ggplot()指定了ggplot2命名空间,但忘记了geom_map()这也是ggplot2的一部分(而不是 blscrapeR中的内部函数)。

在这种情况下,只需加载ggplot2,你就应该好好去。

您也可以考虑联系软件包维护者以告知他们此错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM