使用renv环境的Rscript

np8igboo  于 2023-09-27  发布在  其他
关注(0)|答案(3)|浏览(120)

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

8dtrkrch

8dtrkrch1#

有几种方法:
1.确保工作目录设置为renv项目的根目录,并且renv项目的自动加载程序处于活动状态。(您可以通过在该项目中从R调用renv::activate()来设置自动加载器。
1.在脚本中,显式调用renv::load("/path/to/project")来加载请求的项目。
如果这些方法都不足以解决问题,请在https://github.com/rstudio/renv/issues上提交问题。

2hh7jdfx

2hh7jdfx2#

我最近遇到了类似的问题,但@kevin-ushey的答案是不够的。这是背景。我需要能够从任何目录运行Rscript(因为我有几个统计模型要从Docker文件中调用,所以当你有几个Rscript调用的长文件时,强制Docker文件多次使用WORKDIR太麻烦了。此外,其中一些模型在不同的bash文件中被调用多次,这使得在每次调用Rscript之前将cd添加到目录中变得很麻烦。我们需要类似于conda activate的东西,任何Rscript调用都将默认使用激活的“renv环境”,而不管你的工作目录是什么。这里有一个虚拟的例子:
1.使用install.packages('renv')安装renv
1.使用包含beepr库的虚拟脚本创建虚拟文件夹(仅出于示例目的),并初始化renv环境:

mkdir ~/renv_test/
cd ~/renv_test/
echo "library(beepr); print('success')" >> test.R
Rscript -e "renv::init()"

1.使用下面的代码创建一个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"
ldioqlga

ldioqlga3#

我相信一个比以上答案更简单的方法:

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

它将从基本路径拾取renv环境。也可以使用项目参数指定环境。

相关问题