2011-08-20 48 views
24

我想在Linux上將多個R庫(*)從一個驅動器移動到另一個驅動器,並希望知道簡單移動是否可行和安全,或者是否應該卸載並重新安裝軟件包。我意識到圖書館的位置是通過.libPaths()確定的,並查看了「R安裝和管理」手冊以瞭解有關遷移圖書館的信息,但沒有看到推薦的過程。遷移R庫

我認爲三個選項:所有非基本包

  1. 運行remove.packages(),並通過重新install.packages(lib = "/path/to/new/location")安裝。
  2. 將使用mv庫(目錄),並使用符號鏈接指向到新的位置(並最終移除鏈接就好)
  3. 使用mv命令在Linux中移動目錄批發和R_HOME/etc/Rprofile.site更新.Library.site,如建議R Installation and Administration manual

選項#1是鈍的。選項#2應該可以工作,但似乎有點不合適。

#3安全嗎?還是存在嚴重的問題?我已經確定的問題是:目錄權限和任何軟件包設置存儲絕對路徑而不是相對路徑(這似乎是不健全和不必要的)的可能性。

關於絕對路徑的存儲,我發現rJavaR_HOME的位置存儲在名爲run的文件中。這不是一個圖書館問題本身,但它是一個包(和一個很好的包)的指示保持絕對路徑的私人副本。

(*)有幾個庫和許多包的分數。自然地,只有庫(目錄)被移動,但包可能會受到影響。


更新1 /澄清:只是爲了澄清:我只遷移庫,而不是改變的R或版本的軟件包的版本。更新R或軟件包可以單獨完成,但問題是移動庫是否可行。看起來,如果有必要更新或重新安裝所有軟件包以確保正確安裝,那麼這是一個類似於選項#1的路徑,比選項#3更類似於選項#1。

更新2:對another SO post的回答在升級時如何避免此問題有一些好的想法。我沒有升級R,但是Dirk Eddelbuettel建議不在R的文件樹中安裝軟件包是明智的。

+1

不確定你想要做什麼,但你可能想看看[這個](http://stackoverflow.com/questions/5721942/making-r-installation-self-contained-user-independent/6709445 #6709445)問題和相關內容。 – Fred

+0

+1知道庫和包之間的區別:-) –

+0

@ gsk3:我希望我修復了這種類型的所有可能的錯誤。我不想因這樣一個術語問題而遭到殘酷的對待。 :) – Iterator

回答

23

選項#3(複製舊庫新庫)應該工作...但是當且僅當你再運行:

update.packages(checkBuilt=TRUE) 

這樣需要重建新版本的軟件包將得到更新。通常情況下,新版本會添加要求(例如NAMESPACE在2.14.x中的即將要求)。

編輯:看到這只是在甲板椅子周圍移動....如果你正在移動任何基本的R安裝,我會退出第三個認可。它在Mac上適用於我,但我沒有看到R安裝和管理指南或R常見問題中的承諾,即應該工作。

# In original installation, get the non-default package list: 
save.pkg.list <- installed.packages()[is.na(installed.packages()[ , "Priority"]), 1] 
save(save.pkg.list, file="pkglist.Rdata") 
# If you want to use remove.packages() at this point it's fine. 
# Or just delete their directories. 

隨着R與設置您的喜好(甚至相同的舊安裝).Libpaths一個新安裝的版本:您可以通過此程序完成#1(這可能是最安全的在各種環境下)

load("pkglist.Rdata") 
install.packages(save.pkg.list) 

只是移動軟件包如果R可執行文件沒有被更改可能會成功一個新庫(假設你也改變.Libpaths),但我沒有Linux安裝到測試或知道任何指針的設置方式配置操作會受到影響。

+0

謝謝,這很有趣。你能澄清三件事情:(1)提到「需要重建新版本」的版本,這是指R,是否正確? (2)如果(1)是正確的,那麼如果軟件包不需要重建(即它比當前版本的R更老)會發生什麼? (3)當你說&如果,我認爲這意味着這是一個必要和充分的條件......你真的這麼說嗎? :)如果是這樣,那麼我可能會錯過爲什麼是這樣的情況。我並不反對,但這個選項對我來說是新的,我還沒有掌握邏輯。 – Iterator

+0

(1)是的,例如從R 2.13.x到R 2.14.x的變化,其中x可以是0,1或2.據我所知,簡單的動作複製_might_可以創建一個新的主要版本的功能包,例如從2.13變爲2.14,但決不能保證。所以我可能太絕對了。 「應該工作」意味着將檢查軟件包對版本的依賴關係,並且如果您沒有執行update.packages,則不會執行檢查。 –

+0

但是,如果我只是移動目錄*而不是升級R *,那麼這會有什麼好處? – Iterator