7

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

4

2 回答 2

3

有几种方法:

  1. 确保您的工作目录设置为renv项目的根目录,并且 renv 项目的自动加载器处于活动状态。(您可以通过从该项目中的 R 调用来设置自动加载器renv::activate()。)

  2. 在您的脚本中,显式调用renv::load("/path/to/project")以加载请求的项目。

如果这些方法都不够,请在https://github.com/rstudio/renv/issues提出问题。

于 2021-02-22T22:43:22.490 回答
1

我最近遇到了类似的问题,但@kevin-ushey 的回答是不够的。这是背景。我需要能够Rscript从任何目录运行(因为我有几个要从 Docker 文件调用的统计模型,当你有多个调用的长文件时,强制一个 Docker 文件有WORKDIR很多次太麻烦了Rscript。此外,其中一些模型在不同的 bash 文件中被多次调用,因此cd在每次Rscript调用之前访问目录很麻烦)。我们需要类似于默认情况下conda activate任何Rscript调用都将使用激活的“renv 环境”的东西,而不管您的工作目录是什么。这是一个虚拟示例:

  1. 安装。renv_install.packages('renv')

  2. 使用包含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"
于 2021-05-12T11:22:38.067 回答