2010-10-27 105 views
2

我正在寻找一种在脚本中嵌入fix()函数的方法。基本上,这是我目前正在做的:在.R脚本中嵌入fix()函数?

  1. 我加载了某个包。例如,library(PerformanceAnalytics)
  2. 我打电话给fix()函数来编辑加载包中的几个函数。例如,fix(VaR)
  3. 然后,使用R的内置编辑器,将我的函数复制粘贴到最初从包中加载的函数上。
  4. 最后,我输入我的.R脚本,该脚本调用上述我固定的函数并执行我需要的计算。

本质上,我想简化上面的步骤3。而不必手动输入fix(function)并将其复制粘贴到加载包中的原始函数上,我宁愿只在源代码的脚本中完成。

有没有办法做到这一点?我接触到包的创建者,并用我的修改后的代码加载包的重新编译版本是不可能的。

+1

在步骤1,你的意思是 “库(PerformanceAnalytics)”? – Spacedman 2010-10-28 07:26:06

+0

@Spacedman:固定 – 2010-10-28 09:38:06

回答

3

也许source你的功能然后用assignInNamespace


编辑#1:
以上不会因为assignInNamespace工作并不改变已出口对象。相反,

  1. 把你的函数在一个文件中(foo.R)
  2. 负载包
  3. 然后source(foo.R)sys.source(foo.R, envir=attach(NULL, name="myenv"))

你的职能是,如果在搜索列表中上涨你在之后加载它们这个包,所以R在使用相同名称获得包的函数之前会找到它们。


编辑#2:
我不知道在命名空间VaR称为未导出功能。这就是为什么编辑#1不起作用。要使其起作用,您需要明确引用VaR中使用的所有未导出的PerformanceAnalytics函数(例如,将VaR.Gaussian更改为PerformanceAnalytics:::VaR.Gaussian)。

有关其他方法,请参阅R-devel上的this post。我无法很快得到Ripley教授的解决方案(我在编辑#1中遇到了同样的错误),我没有尝试Gabor的解决方案。

+0

以下是我所做的:VaR.mod < - function(...){...}。然后,assignInNamespace(“VaR”,value = VaR.mod,ns =“PerformanceAnalytics”)然后,我加载了我的pkg库(PerformanceAnalytics)。现在,当我调用VaR函数时,它似乎无法工作,因为其中的许多其他嵌套函数都在“PerformanceAnalytics”环境下。我错过了什么吗? – Ray 2010-10-28 18:40:57

+0

'assignInNamespace'不会更改已经导出的函数,所以它不起作用。看到我的编辑另一种选择。 – 2010-10-28 18:55:55

+0

谢谢你回到我身边约书亚。不幸的是,我尝试了上述方法,但似乎并不奏效。 我的编辑非常简单,函数仍然会调用包内的其他函数(在我的例子中,一个例子是“VaR.Gaussian”函数,我不想改变它)。 所以,当我打电话给VaR(...)例如,它说它找不到VaR.Gaussian和错误。 – Ray 2010-10-28 19:12:32

0

您可以从CRAN下载软件包源代码。编辑函数(它会在PackageName/R中找到),然后将这个软件包安装到R中,并以此方式使用它。

你甚至可以在DESCRIPTION文件中更改包名称......称之为“PerformanceAnalytics2”,然后在R中你只需要library(PerformanceAnalytics2)并像原始包一样使用它。

+0

他明确表示他不能这样做:“用我修改过的代码重新编译的版本不存在这个问题。” – 2010-10-28 01:10:51

+0

那么相当不清楚的问题是什么。 PerformanceAnalytics软件包位于具有GPL许可证的CRAN上 - 如果这就是我们在这里讨论的内容,那么修改的唯一障碍是用户能够建立一个R包构建环境,该环境已有详细记录。为什么没有问题? – Spacedman 2010-10-28 07:30:17

+1

@Sapcedman;不是每个人都可以安装R软件包构建工具 - 本地IT管理政策等。此外,还有一些有效的R方法可以处理软件包中的R代码,以便进行如此小的更改。例如,OP只需要使用'fix()'来超越注视范围,并按照Joshua的回答自动执行该过程。 – 2010-10-28 11:20:35