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

6 浏览
0 Comments

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

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

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

历史:

在过去的某个时刻,我使用默认版本更新了我们的RHEL/CentOS 7服务器上的R版本,当时使用的是yum软件包管理器提供的默认版本。例如,在2019年初的某个时候,我通过sudo yum install R将版本升级到了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文件并进行了安装。默认情况下,这会将R安装在/opt/R/3.6.3/目录下,同时保留3.5.2版本。然而,当我完成创建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/--.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相同的方式将“旧”版本重新安装到/opt/R/3.5.2/中,安装包,并然后删除/usr/lib64/R版本(例如,sudo yum remove R)?

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

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

问题的原因是在Linux系统中,使用sudo命令时,/usr/local/bin路径不会默认加入到PATH环境变量中。这导致了在使用sudo时无法找到R 3.6.3版本。解决方法是修改/etc/sudoers文件中的secure_path,将/usr/local/bin路径加入其中。另外,建议使用RStudio的官方安装方式来安装多个版本的R,并使用符号链接来管理版本之间的切换。如果想要替换默认的R 3.5.2版本,可以先安装R 3.5版本,并安装所需的包,然后使用新的R 3.5版本来运行Shiny Server,并完全卸载EPEL版本的R。最后,可以创建指向/usr/bin路径的符号链接来代替/usr/local/bin路径,并不需要将/usr/local/bin路径添加到sudo的PATH中。

0