[英]Rscript to use renv environment
如何使用RScript myfile.R
執行命令,以便它使用它所在的項目/目錄的 renv 環境,而不是我的默認環境?
有幾種方法:
確保您的工作目錄設置為renv
項目的根目錄,並且 renv 項目的自動加載器處於活動狀態。 (您可以通過在該項目中從 R 調用renv::activate()
來設置自動加載器。)
在您的腳本中,顯式調用renv::load("/path/to/project")
以加載請求的項目。
如果這些方法都不夠,請在https://github.com/rstudio/renv/issues提交問題。
我相信比上述答案更簡單的方法:
Rscript -e 'renv::run("/path/to/myscript.R")'
它將從基本路徑中獲取 renv 環境。 您還可以使用項目參數指定環境。
我最近遇到了類似的問題,但@kevin-ushey 的回答是不夠的。 這是背景。 我需要能夠從任何目錄運行Rscript
(因為我有幾個要從 Docker 文件調用的統計模型,當您有多個Rscript
調用的長文件時,強制 Docker 文件多次具有WORKDIR
太麻煩了. 此外,其中一些模型在不同的 bash 文件中被多次調用,使得在每次Rscript
調用之前cd
到目錄很麻煩)。 我們需要類似於 conda conda activate
的東西,其中任何Rscript
調用默認只使用激活的“renv 環境”,而不管您的工作目錄是什么。 這是一個虛擬示例:
使用install.packages('renv')
安裝renv
。
使用包含beepr
庫的虛擬腳本創建虛擬文件夾(僅出於示例的目的)並初始化renv
環境:
mkdir ~/renv_test/
cd ~/renv_test/
echo "library(beepr); print('success')" >> test.R
Rscript -e "renv::init()"
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
以下是該方法的摘要:
renv
基礎結構復制到一個單獨的文件夾(此處~/.renv/
)並在那里恢復項目。renv
的痕跡(如果出於某種原因我們從該項目的根目錄執行腳本,我們就不會弄亂庫的路徑)。.Renviron
使其在~/.renv
中包含恢復的庫路徑作為默認庫。 這確保任何新的 R session 將使用該庫作為第一個選項。cd
或WORKDIR
(docker) 到項目文件夾。 如果您構建並運行之前的 Docker 映像,即使我們從未cd
到項目文件夾,您也應該獲得成功聲明:
docker build -t renv_test .
docker run renv_test
[1] "success"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.