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

时间:2016-10-27 22:36:49

标签: r function scope namespaces package

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

  

BLS_map_county出错(map_data = df,fill_rate =" unemployed_rate",:     无法找到功能" geom_map"

我认为这是因为我的函数没有指向blscrapeR命名空间。如何将我的功能分配给(已安装,加载)// item is some string representing model name const Model = app.models[item]; Model.create([array of model data],{options}, function(a, b, c){ }); 命名空间,还有什么我需要做的让它从它所需的包中访问任何机器吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

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

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

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

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

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

  

小心 - 使用&#39; :::&#39;风险自负!

  

在代码中使用:::通常是一个设计错误   相应的对象可能已经内部保持良好状态   原因。如果您有这种感觉,请考虑联系软件包维护人员   只需要检查就可以访问该对象。

但是对于你正在做的事情,就暂时黑客攻击同一个软件包中的另一个函数供你自己使用而言,这些警告应该是安全可忽略的(当然是你自己的风险 - 如手册中所述)< / p>

2)在blscrapeR ::bls_map_county()

的情况下

这种情况下的违规行是

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

其中包编写者为ggplot()指定了ggplot2名称空间,但忘记了为geom_map()执行此操作,这也是ggplot2的一部分(并且不是内部函数在blscrapeR)。

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

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