r - 修改当前 R session 的 R 包函数; assignInNamespace 的行为不像 fixInNamespace?

标签 r namespaces

我希望能够以“自动化”的方式修改 R 包中的隐藏函数,例如使用 fixInNamespace ,但我可以提前编写代码,而不是在 fixInNamespace 的“编辑”窗口中做。我想assignInNamespace可以完成这项工作,但目前它不起作用。这是问题的一个例子。

require(quantmod)

getSymbols("AAPL")

chartSeries(AAPL)  # Works fine up to here. 

现在说我想在绘图的左侧而不是右侧绘制 yaxis 刻度。这可以通过修改 quantmod 包中的源代码来完成。修改情节布局的相关代码在隐藏 quantmod 函数调用 chartSeries.chob .

这可以通过这样做来完成:
fixInNamespace("chartSeries.chob", ns = "quantmod")

并在编辑窗口中,从 axis(4) 手动修改第 117 行至 axis(2) ,单击确定,然后再次运行 chartSeries(AAPL) (现在 y 轴标签将绘制在图的左侧)。一切都很好,情节按预期生成,没有问题。

但是……现在假设我想提前(以自动方式)修改 chartSeries.chob,大概是通过采购 chartSeries.chob 函数的修改版本,而不使用编辑窗口。例如,我可能想修改函数中的几十行,并且每次为新的 R session 打开编辑窗口是不切实际的。

我怎样才能做到这一点?

现在我正在这样做,这是行不通的:
assignInNamespace("chartSeries.chob", value = chartSeries.chob2, ns = "quantmod")

我从控制台获取了 chartSeries.chob 的完整副本。修改后的代码在第 117 行。
chartSeries.chob2 <- function (x) 
{
old.par <- par(c("pty", "mar", "xpd", "bg", "xaxs", "las", 
                   "col.axis", "fg"))
  on.exit(par(old.par))
....

[Edit On 117:] axis(2)
...
}

当我从控制台运行时:
chartSeries(AAPL)

或者
quantmod:::chartSeries(AAPL)

我收到错误——从 chartSeries.chob 中调用 quantmod 中的其他函数没有找到函数,大概是因为编辑了chartSeries.chob函数不在 quantmod 命名空间中?

我注意到在输入 quantmod:::chartSeries.chob 时从assignInNamespace命令之后的控制台,没有environment: namespace:quantmod在函数定义的末尾。

但如果我做 fixInNamespace修改方法,当我输入quantmod:::chartSeries.chob ,然后我确实看到了 environment: namespace:quantmod附加到函数定义的末尾。

最佳答案

fixInNamespace电话assignInNamespace你应该能够让它工作,问题可能是环境不一样,可能还有其他一些属性。如果您将它们更改为匹配,那么我希望它可以更好地工作,可能使用如下代码:

tmpfun <- get("chartSeries.chob", envir = asNamespace("quantmod"))
environment(chartSeries.chob2) <- environment(tmpfun)
attributes(chartSeries.chob2) <- attributes(tmpfun)  # don't know if this is really needed
assignInNamespace("chartSeries.chob", chartseries.chob2, ns="quantmod")

某些更改的另一种选择是使用 trace功能。这将进行临时更改并且可以用于插入代码,但我不知道删除命令或就地修改是否合理(指定更改代码的编辑器而不是让您更改它可能会使这成为可能) .

关于r - 修改当前 R session 的 R 包函数; assignInNamespace 的行为不像 fixInNamespace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23279904/

相关文章:

r - 计算字符串向量中每个字母的数量

android - 如何将库资源添加到 Cordova 项目?

r - 是否有舍入 p 值的函数?

c++ - FOO::BAR 类命名空间的 Qt MOC 错误

php - 命名空间和 spl_autoload_register

c++ - 如何避免链接器错误

php - Laravel artisan 错误 :processutils

r - R 中的 IQR 异常值

r - 如何使用 R future 包在集群内进行并行计算?

r - 如何使用网格搜索和 tidymodels 的单个验证折叠来调整模型?