【发布时间】: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)?李>
我看过但没有回答我的问题的类似问题的链接:
【问题讨论】: