FXQ*_*der 11 namespaces r
我希望能够以"自动"的方式修改R包中的隐藏函数,比如使用fixInNamespace,但是我可以提前编写代码,而不是在"编辑"窗口fixInNamespace中.我认为assignInNamespace可以做到这一点,但目前它没有用.这是问题的一个例子.
require(quantmod)
getSymbols("AAPL")
chartSeries(AAPL) # Works fine up to here.
Run Code Online (Sandbox Code Playgroud)
现在说我想在绘图的左侧绘制y轴,而不是右边.这可以通过修改quantmod包中的源代码来完成.修改绘图布局的相关代码位于隐藏的 quantmod函数中chartSeries.chob.
这可以通过这样做来完成:
fixInNamespace("chartSeries.chob", ns = "quantmod")
Run Code Online (Sandbox Code Playgroud)
在编辑窗口中,手动修改第117行axis(4)至axis(2),单击"确定",然后再次运行chartSeries(AAPL) (现在,y轴标签将绘制在图的左侧).一切都很好,情节按预期生成,没有问题.
但是......现在假设我想提前修改chartSeries.chob(以自动方式),大概是通过获取chartSeries.chob函数的修改版本,而不使用编辑窗口.我可能想要在函数中修改几十行,并且每次为新的R会话打开编辑窗口都是不切实际的.
我怎样才能做到这一点?
现在我这样做,这是行不通的:
assignInNamespace("chartSeries.chob", value = chartSeries.chob2, ns = "quantmod")
Run Code Online (Sandbox Code Playgroud)
我从控制台获取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)
...
}
Run Code Online (Sandbox Code Playgroud)
当我从控制台运行时:
chartSeries(AAPL)
Run Code Online (Sandbox Code Playgroud)
要么
quantmod:::chartSeries(AAPL)
Run Code Online (Sandbox Code Playgroud)
我得到错误 - 找不到函数内的quantmod中其他函数的调用chartSeries.chob,可能是因为编辑的chartSeries.chob函数不在quantmod名称空间中?
我注意到quantmod:::chartSeries.chob在assignInNamespace命令之后从控制台输入environment: namespace:quantmod时,函数定义的末尾没有.
但是,如果我进行fixInNamespace修改方法,当我键入时quantmod:::chartSeries.chob,我确实看到environment: namespace:quantmod附加到函数定义的末尾.
Gre*_*now 15
由于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")
Run Code Online (Sandbox Code Playgroud)
某些更改的另一个选择是使用该trace功能.这将进行临时更改,并且可以很好地插入代码,但我不知道删除命令或就地修改是否合理(指定编辑器更改代码而不是让您更改它可能会使这成为可能) .