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

4
也许更准确的标题应该是:“如何在Linux(Red Hat/CentOS)上从原地(EPEL)R切换到侧边(版本特定)R安装?”(如下所示)
一个(可能典型的)Linux升级R的故事...
历史:
过去的某个时候,我使用默认版本更新了我们的RHEL/CentOS 7服务器上的R版本。例如,在2019年初的某个时候,使用yum包管理器将其更新到版本3.5.2。默认情况下,这会为所有用户安装R在/usr/lib64/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文件并安装它。默认情况下,这会在/opt/R/3.6.3/中安装R,并保留3.5.2版本不变。但是,一旦我完成创建到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 

在我的 Shiny 应用程序日志文件中出现错误消息(位于 /var/log/shiny-server/<app name>-<user>-<datetime>.log),确认应用程序由于缺少软件包而无法启动。要更新共享库文件夹中的 R 软件包,我需要使用 sudo 运行新版本的 R: sudo -i /opt/R/3.6.3/bin/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 可执行文件的 Shell 包装器”,并且其路径硬编码为“/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)?
  • 使用和安装 3.6.3 相同的 .rpm 将“旧”版本重新安装到 /opt/R/3.5.2/ 中,在那里安装软件包,然后删除 /usr/lib64/R 版本(例如:sudo yum remove R)?

类似的问题链接,我查看了但没有回答我问题:

  1. 如何在 Linux 上升级 R
  2. 更改 Linux 上的路径
  3. 如何在 Linux 中加载特定版本的 R
1个回答

4
问题1: 我不确定为什么,在您的路径下有多个R版本可能会导致意外的情况,就像这样。在路径中,/usr/local/bin通常在/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 版本,以便更易于管理。下次安装新版本的 R 时,您只需替换/usr/local/bin 中的符号链接。默认的系统 R(来自 EPEL)应该是系统上唯一的 R,并且支持就地升级。

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


啊哈!对于我的用户,/usr/local/bin/usr/bin 之前,但是在 sudo 下却不在那里。这似乎解决了问题1,我会进一步调查。这很明确:“默认的系统 R(来自 EPEL)应该是系统上唯一的 R,具有原地升级功能。”我没有考虑到两种安装类型是“并排”和“独立/原地”,但这种分类非常有意义。非常有帮助,谢谢! - Brian D
1
循环结束:在删除EPEL版本(sudo yum remove R,以及R-core,R-core-devel,R-devel,R-java,R-java-devel)后,sudo which R再也找不到R的位置了(因为/usr/bin/R已被删除)。创建符号链接sudo ln -s /opt/R/3.6.3/bin/R /usr/bin/R可以解决这个问题,正如您所说的那样。 - Brian D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接