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

标签 r linux shiny centos7

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

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

历史:

在过去的某个时候,我使用 yum 下拉的默认版本更新了 RHEL/CentOS 7 服务器上的 R 版本。当时的包管理器。例如,sudo yum install R在 2019 年初的某个时候升级到版本 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 版本。但是,一旦我完成 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 包。我可以通过删除这些符号链接(symbolic link)快速让我的应用程序在以前的版本 (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 包,我可以重新创建符号链接(symbolic link):

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 替换为指向新版本的符号链接(symbolic link)(例如 sudo ln -s /opt/R/3.6.3/bin/R /bin/R )?
  • 将“旧”版本重新安装到 /opt/R/3.5.2/使用与我安装 3.6.3 相同的方式使用 .rpm,在那里安装软件包,然后删除 /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

最佳答案

问题 1: 我不确定为什么,但是在您的 PATH 中有多个版本的 R 会导致像这样的意外情况。 /usr/local/bin通常在 /usr/bin 之前在 PATH 中,所以我希望找到 R 3.6.3。可能跟问题2有关。

问题 2:一些发行版(如 CentOS/RHEL)不放置 /usr/local/bin使用 sudo 时默认在 PATH 上。参见 https://unix.stackexchange.com/questions/8646/why-are-path-variables-different-when-running-via-sudo-and-su了解详情。那里的答案描述了几种添加 /usr/local/bin 的方法使用 sudo 时添加到 PATH——例如,修改 secure_path/etc/sudoers包括 /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 .但最终,我建议以相同的方式安装多个并行版本的 R,使用 https://docs.rstudio.com/resources/install-r/ ,所以更容易管理。下次安装新的 R 版本时,只需替换 /usr/local/bin 中的符号链接(symbolic link)即可。 .默认系统 R(来自 EPEL)是系统上唯一的 R,具有就地升级。

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

关于r - 如何在 Linux (Red Hat/CentOS) 上更新到特定的 R 版本,同时保持以前的版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61646933/

相关文章:

Linux:更新 yaml 文件中的值

c++ - Visual Studio 在 vmware 中与 gcc/gdb 交叉编译 -> 内存访问错误

r - Shiny /传单 map 未呈现

r - 可点击的超链接 Shiny R

R Shiny 使 slider 值动态化

r - 搜索推特并通过hashtag获取推文,最大化返回搜索结果数量

r - 如何访问 Rcpp::List 中向量的元素

r - 将 Shiny 的应用程序开发为一个包并将其部署到 Shiny 的服务器

linux - 如何在linux ubuntu中安装python3线程模块

r - 将弹出窗口添加到 Shiny 的应用程序?