使用renv环境的R脚本

15

如何使用RScript myfile.R命令在项目/目录的renv环境中执行,而不是默认环境?

3个回答

8
有两种方法:
  1. 确保你的工作目录设置为你的 renv 项目的根目录,并且 renv 项目的自动加载器处于活动状态。(你可以在该项目中调用 R 的 renv::activate() 来设置自动加载器。)

  2. 在你的脚本中,显式地调用 renv::load("/path/to/project") 来加载所需的项目。

如果这些方法都不行,请到 https://github.com/rstudio/renv/issues 提交问题。


4
我最近遇到了一个类似的问题,但是@kevin-ushey的答案不够充分。以下是背景:我需要能够从任何目录运行Rscript(因为我有几个统计模型需要从Docker文件中调用,强制Docker文件多次拥有WORKDIR在长度较长的文件中具有多个Rscript调用时太麻烦。此外,其中一些模型在不同的bash文件中被多次调用,使得在每个Rscript调用之前都要cd到该目录变得繁琐)。我们需要类似于conda activate的东西,在任何工作目录下,任何Rscript调用都默认使用已激活的“renv环境”。以下是一个虚拟示例:
  1. 使用install.packages('renv')安装renv
  2. 创建带有包含beepr库(仅为示例而用)的虚拟文件夹和虚拟脚本,并初始化renv环境:
mkdir ~/renv_test/
cd ~/renv_test/
echo "library(beepr); print('success')" >> test.R
Rscript -e "renv::init()"

使用以下代码创建一个Docker镜像:
FROM rocker/r-base

ENV PROJ_ROOT='/usr/local/src/renv_test'
ENV RENV_DIR='/usr/local/.renv/'

COPY . $PROJ_ROOT

# Copy the projects renv infrastructure to RENV_DIR and remove all traces of renv from PROJ_ROOT
RUN mkdir -p $RENV_DIR/renv/ && \
  cp $PROJ_ROOT/renv.lock $RENV_DIR && \
  cp $PROJ_ROOT/renv/activate.R $RENV_DIR/renv/ && \
  echo "source('renv/activate.R')" >> $RENV_DIR/.Rprofile && \
  cd $RENV_DIR && \
  Rscript -e "renv::restore()" && \
  cd $PROJ_ROOT && Rscript -e "renv::deactivate()" && \
  rm -rf renv/ renv.lock

# Set RENV_DIR's restore library as the default library
RUN echo $(cd $RENV_DIR && Rscript -e "cat(paste0('R_LIBS=', renv::paths\$library()), sep = '\n')") >> $HOME/.Renviron


# Run any script from any directory as if you had 'renv activated'
CMD Rscript $PROJ_ROOT/test.R

这里是方法的概述:
  • 将项目复制到Docker镜像中
  • renv基础设施复制到单独的文件夹中(这里是~/.renv/),并在那里恢复项目。
  • 消除项目文件夹中renv的所有痕迹(这样我们就不会因为某些原因从此项目的根目录执行脚本而弄乱库的路径)。
  • 编辑.Renviron,使其包含已恢复库路径~/.renv作为默认库。这确保任何新的R会话都将使用该库作为第一个选项。
  • 执行位于项目文件夹中的任何R脚本,而无需cdWORKDIR(docker)到项目文件夹。
如果您构建和运行先前的Docker镜像,则应该获得成功声明,即使我们从未cd到项目文件夹:
docker build -t renv_test .
docker run renv_test
[1] "success"

2
我相信以下这种方法比上面的回答更简单:

我相信以下这种方法比上面的回答更简单:

Rscript -e 'renv::run("/path/to/myscript.R")'

它将从基本路径中获取renv环境。您还可以使用项目参数指定环境。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接