问题描述
如何使用 RScript myfile.R
执行命令,以便它使用它所在的项目/目录的 renv 环境,而不是我的默认环境?
解决方法
有几种方法:
-
确保您的工作目录设置为
renv
项目的根目录,并且 renv 项目的自动加载器处于活动状态。 (您可以通过在该项目中从 R 调用renv::activate()
来设置自动加载器。) -
在您的脚本中,显式调用
renv::load("/path/to/project")
以加载请求的项目。
如果这些方法都不够用,请在 https://github.com/rstudio/renv/issues 提交问题。
,我最近遇到了类似的问题,但@kevin-ushey 的回答不够充分。这是背景。我需要能够从任何目录运行 Rscript
(因为我有几个将从 Docker 文件调用的统计模型,强制一个 Docker 文件具有 WORKDIR
很多次是太麻烦了您有多个 Rscript
调用的长文件。此外,其中一些模型在不同的 bash 文件中被多次调用,使得在每次 cd
调用之前 Rscript
到目录很麻烦)。我们需要类似于 conda activate
的东西,其中任何 Rscript
调用都会默认使用激活的“renv 环境”,而不管您的工作目录是什么。这是一个虚拟示例:
-
使用
renv
安装install.packages('renv')
。 -
使用包含
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 脚本,而无需
cd
或WORKDIR
(docker) 到项目文件夹。
如果您构建并运行之前的 Docker 映像,即使我们从未cd
到项目文件夹,您也应该得到成功声明:
docker build -t renv_test .
docker run renv_test
[1] "success"