我需要切换到旧版本的 R 来运行一个脚本

Posted

技术标签:

【中文标题】我需要切换到旧版本的 R 来运行一个脚本【英文标题】:I need to switch to an old version of R to run one script 【发布时间】:2020-11-24 03:21:27 【问题描述】:

我正在尝试运行在旧版本 R 上构建的脚本。它在一台运行 R/3.4.4 的计算机上运行。它在另一个运行 R/3.6.3 时中断。作者在他的 github 上检查了一个问题来解决这个问题(我认为),但他正在完成他的博士学位,所以这可能会在两个月、两年或永远不会发生。

我在$HOME/.local 路径中安装了 R/3.4.4(另一个在/usr/bin 中)。当我运行这个脚本时,我只是不知道如何临时指向 .local 中的版本。我尝试使用export R_HOME=$HOME/.local 设置 R_HOME,但 R 忽略了这一点。

我确信以前有人问过这个问题,但我找不到任何不涉及 RStudio 的东西。我的 WSL(运行 Ubuntu 20.04)上没有 RStudio,所以我需要一个基于终端的解决方案。

有人能解释一下怎么做吗?我觉得真的很密集,真的很累。谢谢。

【问题讨论】:

您刚刚运行$HOME/.local/bin/Rscript /path/to/file.R 吗?如果您使用特定的可执行文件来使用,它不会在/usr/bin/ 中查找。 但是,您确实需要所有所需软件包的 R-3.4 版本:通常需要在 R 的次要版本之间“全新”安装它们(3.4 和 3.6 是不同的次要版本)。 您的脚本到底是什么样的?它只是调用R 还是Rscript?如果是这种情况,您的操作系统将搜索您的系统路径以找到该程序。您可以通过调用which Rwhich Rscript 查看是否找到了哪一个。如果要更改找到的文件夹,则需要显式传递完整路径,或更改路径环境变量以列出要运行的 R 的文件夹在您不想使用的文件夹之前。 R_HOME 在你启动 R 之后才有意义,它不控制你运行哪个 R。 @r2evans,哇……真的很神奇,剥夺睡眠会对一个人造成什么影响。如果您将其写为答案,我会接受。它与建议的解决方案不同,并且可以更好地解决我的临时需求。我将使用 renv 进行包版本控制!谢谢! @MrFlick,是的 - 与 r2evans 相同 - 这是我正在寻找的(非常简单!)解决方案。我已经工作了整整 3 天,每天 12 小时......有时在某个点之后,最简单的解决方案对我来说是无法实现的。 【参考方案1】:

更改您的PATH 在某些方面可能有用,但由于(我推断)您打算将其作为异常,因此只需使用可执行文件的完整路径运行它应该足够了。如果您的任务被封装在一个名为script.R 的脚本中,那么也许

$HOMD/.local/R_3.4.4/bin/x64/Rscript /path/to/script.R

应该足够了。

不过,这可能会咬到你,这取决于当前 R 的安装方式。你说它在/usr/bin/,这表明它的库路径可能是这样的:

$ Rscript -e '.libPaths()'
[1] "/usr/local/lib/R/site-library"
[2] "/usr/lib/R/site-library"
[3] "/usr/lib/R/library"

(这里的Rscript 是默认/当前版本)。不幸的是,这些目录中的包没有存储为特定于版本的包,因此使用 R-3.4.4 的更现代版本的包有可能(甚至很可能)会在某种程度上失败。

先发制人的两种策略。假设您在特定目录中拥有 R-3.4.4 的所有软件包,第一个工作正常。

    一种方法是为命令设置R_LIBS_USER (env-var)。这可以在同一个命令行上,也可以通过一些.Renviron 文件或类似文件进行控制:

    $ mkdir -p .local/R-3.4.4/library
    $ R_LIBS_USER=~/.local/R-3.4.4/library Rscript -e '.libPaths()'
    [1] "/home/r2/.local/R-3.4.4/library"
    [2] "/usr/local/lib/R/site-library"
    [3] "/usr/lib/R/site-library"
    [4] "/usr/lib/R/library"
    

    这样,假设所有需要的包都在第一个路径中找到,它永远不会在其他路径中查找,因此应该不会遇到冲突。如果您的脚本是稳定的/不变的,并且您没有在.local 内破坏您的 R-3.4.4 实例,那么......一切都会很愉快。

    修改脚本本身以硬控制库路径。通过覆盖R_HOME(环境变量),您可以覆盖所有默认值。

    echo "R_HOME=~/.local/R-3.4.4" > .Renviron # current working directory, regardless of script.R
    Rscript /path/to/script.R
    

    这假定.local/R_3.4.4 是一个完整 R 安装...它需要所有基本内容以及您可能已安装的任何其他软件包。

【讨论】:

【参考方案2】:

您可能在旧目录之后添加了新目录。您可以使用以下方法进行检查:

echo $PATH

如果是这种情况,那么您需要将其添加到路径的前面。假设你安装在/usr/local/bin,那么你应该使用如下命令:

export PATH="/usr/local/bin:$PATH"

【讨论】:

以上是关于我需要切换到旧版本的 R 来运行一个脚本的主要内容,如果未能解决你的问题,请参考以下文章

iTunes恢复到旧版本[关闭]

如何使用 gem install 降级到旧版本的指南针?

如何在 Linux 中修改默认的 Java 版本

Python3 绑定到旧版本

如何运行使用旧版本包和最新 R 版本和包中的 R 编写的 R 脚本? [关闭]

如何在 Mac OSX 上的 Java 版本之间切换? [复制]