我需要切换到旧版本的 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 R
或which 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 来运行一个脚本的主要内容,如果未能解决你的问题,请参考以下文章