我想将一个特殊修改的函数添加到其他人编写的包中,使用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){
});
命名空间,还有什么我需要做的让它从它所需的包中访问任何机器吗?
答案 0 :(得分:6)
当我攻击特定包中的某个函数时,该函数又调用其他函数,我经常在定义后使用此表单:
mof_func <- function( args) {body hacked}
environment(mod_func) <- environment(old_func)
但我认为你真正想要的功能是assignInNamespace
。这些方法将允许访问已加载包中的非导出函数。但是,如果未加载包,它们将不会成功。所以你可能想要围绕require(pkgname)
进行一次stopifnot()检查。
答案 1 :(得分:4)
这个答案有两个部分 - 首先是你问题的通用答案,第二部分是你所引用的特定功能的具体答案,其中问题略有不同。
您应该已经可以访问包命名空间,因为您已加载它,因此只有未导出的函数会给您带来问题。
我通常只使用:::
运算符将包名称添加到非导出函数。即,找到对some_internal_function()
的每个调用实例,并将其替换为PackageName:::some_internal_function()
。如果在您正在编辑的函数中调用了几个不同的内部函数,则可能需要对每个有问题的函数调用执行此操作几次。
:::
的帮助页面确实包含这些警告
小心 - 使用&#39; :::&#39;风险自负!
和
在代码中使用:::通常是一个设计错误 相应的对象可能已经内部保持良好状态 原因。如果您有这种感觉,请考虑联系软件包维护人员 只需要检查就可以访问该对象。
但是对于你正在做的事情,就暂时黑客攻击同一个软件包中的另一个函数供你自己使用而言,这些警告应该是安全可忽略的(当然是你自己的风险 - 如手册中所述)< / p>
blscrapeR ::bls_map_county()
这种情况下的违规行是
ggplot2::ggplot() + geom_map(...
其中包编写者为ggplot()
指定了ggplot2名称空间,但忘记了为geom_map()
执行此操作,这也是ggplot2的一部分(并且不是内部函数在blscrapeR)。
在这种情况下,只需加载ggplot2,你就应该好了。
您也可以考虑与软件包维护人员联系,告知他们此错误。