我希望能够以“自动化”的方式修改 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/