修改当前R会话的R包功能; assignInNamespace的行为不像fixInNamespace?

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功能.这将进行临时更改,并且可以很好地插入代码,但我不知道删除命令或就地修改是否合理(指定编辑器更改代码而不是让您更改它可能会使这成为可能) .

  • @FXQuantTrader,抱歉这是我现在修复的拼写错误,它应该是`envir`而不是`ns`而你需要`asNamespace`,我从`fixInNamespace`的代码中复制了错误的部分. (2认同)
  • 啊,现在它的作品!优秀.秘诀是设置envir = asNamespace("quantmod"),而不是像envir = as.environment("package:quantmod").有点混乱但你的解决方案有效.谢谢!如果对轨道中的任何一个感兴趣,那么属性(chartSeries.chob2)< - attributes(tmpfun)似乎不需要使assignInNamespace正常工作. (2认同)
  • 我尝试使用包名称中的可见函数来执行此操作,但每当我运行`assignInNamespace("getfame",getfame2,ns ="fame")`或`assignInNamespace("getfame",getfame2,ns = asNamespace("fame")时"))`当我输入`getfame`时,我得到旧包默认值. (2认同)