簡體   English   中英

如何在 Linux (Red Hat/CentOS) 上更新到特定的 R 版本,保持以前的版本?

[英]How to update to specific R version on Linux (Red Hat/CentOS), keeping the previous version?

也許更准確的標題是:“如何在 ZEDC9F0A5A5D57797BF68E373647438 上從就地 (EPEL) R 切換到並排(特定於版本)R 安裝?

一個(可能是典型的)在 Linux 故事上升級 R...

歷史:

在過去的某個時候,我使用當時由yum package 管理器下拉的默認版本在我們的 RHEL/CentOS 7 服務器上更新了 R 的版本。 例如,在 2019 年初的某個時間點sudo yum install R到版本 3.5.2。默認情況下,這會在/usr/lib64/R為所有用戶安裝 R,並完全替換之前安裝的 3.4.x 版本。 Shiny 服務器已經安裝,配置為以用戶shiny運行,它順利地拿起了新版本的 R。

情況:

一年后,現在是時候硬着頭皮更新在 Linux 服務器上運行的 R 版本了。 運行yum check-upgrade R發現可用的版本是3.6.0。 我實際上想安裝 3.6.3 並且我不想破壞我在 3.5.2 上運行的所有應用程序,所以我需要使用不同的方法。 按照https://docs.rstudio.com/resources/install-r/中的說明下載 3.6.3.rpm 文件並安裝它。 默認情況下,這會將 R 安裝在/opt/R/3.6.3/ ,保留 3.5.2 版本。 但是,一旦我完成了Create a symlink to R步驟,我的 shiny 應用程序都不起作用:

sudo ln -s /opt/R/3.6.3/bin/R /usr/local/bin/R  
sudo ln -s /opt/R/3.6.3/bin/Rscript /usr/local/bin/Rscript  

這應該不足為奇。 我的 shiny 應用程序都依賴於幾個 R 軟件包,這些軟件包尚未為這個新版本的 R 安裝。 通過刪除這些符號鏈接,我可以快速讓我的應用程序在以前的版本 (3.5.2) 上再次運行,直到我在新版本中安裝了必要的軟件包:

sudo rm /usr/local/bin/R  
sudo rm /usr/local/bin/Rscript 

我的 shiny 應用程序日志文件(位於/var/log/shiny-server/<app name>-<user>-<datetime>.log )中的錯誤消息確認應用程序由於缺少軟件包而無法啟動。 要更新共享庫文件夾中的 R 包,我需要以 sudo 運行新版本的 R: sudo -i /opt/R/3.6.3/bin/R並安裝必要的包,例如install.packages(c("shiny","devtools","rmarkdown","shinydashboard","tidyverse"))在 R 中。

現在安裝了 R 包,我可以重新創建符號鏈接:

sudo ln -s /opt/R/3.6.3/bin/R /usr/local/bin/R  
sudo ln -s /opt/R/3.6.3/bin/Rscript /usr/local/bin/Rscript  

我確認我的應用程序正在使用新版本的 R。

現在我有一些問題:

問題1:完成這些步驟后, R --version仍然返回舊版本(3.5.2)。 但是當我第二天重新登錄時,它會打開 3.6.3。 為什么? 我是否需要運行終端命令來獲取R --version以立即返回新版本,還是打開新終端 window 是實現此目的的唯一方法?

問題 2:運行sudo R --version總是返回舊版本(3.5.2)。 運行sudo which R返回/bin/R 運行more /bin/R會顯示 state 的內容,它是“R 可執行文件的外殼包裝器”。 並具有硬編碼的“/usr/lib64/R”路徑。 我認為此時我不需要這個包裝器。 讓這些 sudo 命令指向新版本的推薦方法是什么?

為了以防萬一,我可以在我的主目錄(例如cp /bin/R ~/binR.backup )中制作這個文件的備份副本,然后:

  • 刪除 /bin/R?
  • 將 /bin/R 替換為新版本的符號鏈接(例如sudo ln -s /opt/R/3.6.3/bin/R /bin/R )?
  • 使用 a.rpm 將“舊”版本重新安裝到/opt/R/3.5.2/中,就像我安裝 3.6.3 一樣,在那里安裝軟件包,然后刪除/usr/lib64/R版本(例如, sudo yum remove R )?

我看過但沒有回答我的問題的類似問題的鏈接:

  1. 如何在 Linux 中升級 R
  2. 更改 Linux 中的路徑
  3. 如何在 Linux 中加載特定版本的 R

問題 1:我不知道為什么,但是在 PATH 上有多個版本的 R 可能會導致這樣的意外情況。 /usr/local/bin通常在 PATH 中位於/usr/bin之前,所以我預計會找到 R 3.6.3。 也許它與問題2有關。

問題 2:一些發行版(如 CentOS/RHEL)在使用 sudo 時默認不會將/usr/local/bin放在 PATH 上。 有關詳細信息,請參閱https://unix.stackexchange.com/questions/8646/why-are-path-variables-different-when-running-via-sudo-and-su 那里的答案描述了幾種在使用 sudo 時將/usr/local/bin添加到 PATH 的方法——例如,修改/etc/sudoers中的secure_path以包含/usr/local/bin ,例如:

Defaults    secure_path = /usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

R 3.6.3 在默認系統 R 之前,您不必刪除/bin/R/usr/bin/R 但最終,我建議使用https://docs.rstudio.com/resources/install以相同的方式安裝多個並排版本的 R。 下次安裝新的 R 版本時,只需替換/usr/local/bin中的符號鏈接即可。 默認系統 R(來自 EPEL)意味着是系統上唯一的 R,具有就地升級。

If you want to replace the default R 3.5.2 with a side-by-side R 3.5.2 (or 3.5.3), you could install R 3.5 from https://docs.rstudio.com/resources/install-r / ,安裝所有必要的軟件包,並讓 Shiny 服務器使用新的 R 3.5。 然后從 EPEL( R-coreR-core-devel )卸載 R 以完全切換。 從那里,您甚至可以在/usr/bin而不是/usr/local/bin中創建指向 R 的符號鏈接,而不必擔心將/usr/local/bin添加到 sudo PATH。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM