2010-10-27 74 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