2012-04-30 58 views
4

我正在R中開發一個軟件包。我們將其稱爲mypkg。因爲一些函數在從包中運行時行爲有所不同(我不確定爲什麼 - 但這不是問題),所以我正在編輯包中的函數,然後從命令行重新構建包。由於某種原因,給定的R實例會保留舊版本的功能,即使源已更改並重新構建和重新安裝了該程序包。我需要啓動一個新實例來查看更改。在R中開發軟件包時清除以前版本的功能

這是典型的工作流程。

  1. mypkg.R
  2. 進行更改myfunction()在R:detach(package:mypkg); remove.packages("mypkg")
  3. 命令行:R CMD INSTALL --build c:\mypkg
  4. 通知我,這已經被安裝到默認庫
  5. 在R:library(mypkg)
  6. 在R中:myfunction()在更改之前運行先前的版本。

[接下來的三個步驟,我想避免]

  1. 開始一個新的R實例
  2. 在R:library(mypkg)
  3. myfunction()按預期工作

下[R運行.2.14.1。

我在尋找如何改進這個工作流以避免啓動一個新的R實例的建議。

回答

4

您需要嘗試卸載軟件包以及將其卸下。 ?detach具有:

如果一個包具有一個命名空間,分離它默認不 卸載命名空間(和可能甚至不與「卸載= TRUE」),和 拆卸不會在一般卸載任何動態加載 編譯的代碼(DLL)。此外,來自 名稱空間的註冊S3方法將不會被刪除。如果您在其名稱空間已加載的程序包 上使用「庫」,則它會附加已加載名稱空間的已導出的出口。因此,拆卸和重新連接程序包可能不會刷新程序包的部分或全部組件,也不適用。

特別注意最後一句。

嘗試:

detach(package:mypkg, unload = TRUE) 

注意,「如果一個包有一個命名空間」現在意味着所有的軟件包,因爲這是R中2.14改變。0(IIRC版本號)

如果要更改代碼爲R代碼,可以考慮使用assignInNamespace()分配在全局工作區中的對象/功能(在mypkg的功能即更新的版本)到mypkg命名空間。例如,我們有功能foo()mypkg和地方,我們有newfoo()這是foo()新版本:

assignInNamespace("foo", newfoo, "mypkg") 

如果修改涉及到C代碼,或上述不工作,那麼也許你應該遵循R核心的建議,併產生一個新的R實例,而不是試圖分離你的包。

另請參閱devtools Hadley Wickham和Emacs + ESS包可能會使開發過程更容易(產生新的R實例等),如果您說Emacs。

+0

'detach(package:mypkg,unload = TRUE)'當然是完美的。我一直在避免學習這些新的命名空間事物。看起來好像我可以避免它不再。 – digitalmaps