【问题标题】:How to update to specific R version on Linux (Red Hat/CentOS), keeping the previous version?如何在 Linux(Red Hat/CentOS)上更新到特定的 R 版本,保持以前的版本?
【发布时间】:2020-05-06 23:01:36
【问题描述】:

也许更准确的标题是:“如何在 Linux (Red Hat/CentOS) 上从就地 (EPEL) R 切换到并行(特定于版本)R 安装?

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

历史:

在过去的某个时候,我使用当时yum 包管理器下拉的默认版本更新了我们的 RHEL/CentOS 7 服务器上的 R 版本。例如,sudo yum install R 在 2019 年初的某个时间点升级到版本 3.5.2。默认情况下,这会为所有用户在/usr/lib64/R 安装 R,并完全替换之前安装在那里的 3.4.x 版本。 Shiny Server 已经安装,配置为以用户 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 步骤,我的闪亮应用程序都无法运行:

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 安装的几个 R 包。我可以通过删除这些符号链接快速让我的应用程序在以前的版本 (3.5.2) 上再次运行,直到我安装了新版本中的必要包:

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

我闪亮的应用程序日志文件(/var/log/shiny-server/<app name>-<user>-<datetime>.log)中的错误消息确认应用程序由于缺少软件包而无法启动。要更新共享库文件夹中的 R 包,我需要以 sudo:sudo -i /opt/R/3.6.3/bin/R 运行新版本的 R 并安装必要的包,例如 R 中的 install.packages(c("shiny","devtools","rmarkdown","shinydashboard","tidyverse"))

现在已经安装了 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 立即返回新版本,还是打开一个新的终端窗口是实现此目的的唯一方法?

问题 2: 运行 sudo R --version 总是返回旧版本 (3.5.2)。运行 sudo which R 返回 /bin/R。运行more /bin/R 显示的内容表明它是“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)?
  • 使用 .rpm 将“旧”版本重新安装到 /opt/R/3.5.2/,就像我安装 3.6.3 一样,在那里安装软件包,然后删除 /usr/lib64/R 版本(例如,sudo yum remove R)?李>

我看过但没有回答我的问题的类似问题的链接:

  1. How to upgrade R in Linux
  2. Change path in Linux
  3. How can I load a specific version of R in Linux

【问题讨论】:

    标签: r linux shiny centos7


    【解决方案1】:

    问题 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 在 PATH 中的默认系统 R 之前,您不必删除 /bin/R/usr/bin/R。但最终,我建议使用https://docs.rstudio.com/resources/install-r/ 以相同的方式安装多个并行版本的 R,这样更易​​于管理。下次安装新的 R 版本时,只需替换 /usr/local/bin 中的符号链接即可。默认系统 R(来自 EPEL)是系统上唯一的 R,具有就地升级。

    如果您想将默认的 R 3.5.2 替换为并排的 R 3.5.2(或 3.5.3),您可以从 https://docs.rstudio.com/resources/install-r/ 安装 R 3.5,安装所有必要的软件包,并拥有 Shiny服务器使用新的 R 3.5。然后从 EPEL(R-coreR-core-devel)卸载 R 以完全切换。从那里,您甚至可以在 /usr/bin 而不是 /usr/local/bin 中创建指向 R 的符号链接,而不必担心将 /usr/local/bin 添加到 sudo PATH。

    【讨论】:

    • 啊哈!对于我的用户,/usr/local/bin 领先于/usr/bin,但作为 sudo 它不存在。这似乎确实解决了问题 1,我将对此进行更多调查。这是澄清:“默认系统 R(来自 EPEL)意味着是系统上唯一的 R,具有就地升级。”我没有将这两种类型的安装视为“并排”和“独立”/“就地”,但这种分类很有意义。很有帮助,谢谢!
    • 关闭循环:删除 EPEL 版本后(sudo yum remove R,以及 R-core、R-core-devel、R-devel、R-java、R-java-devel),@987654343 @ 在任何地方都找不到 R(因为 /usr/bin/R 已被删除)。正如您所说,创建符号链接 sudo ln -s /opt/R/3.6.3/bin/R /usr/bin/R 可以解决此问题。
    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多