renv + venv + jupyterlab + IRkernel:它会混合吗?

psa*_*rka 3 python r rprofile jupyter-notebook renv

简洁版本

\n

renvvenv一起使用的简单而优雅的方式是什么jupyterlabIRkernel特别是,如何renv从不在根目录的jupyter笔记本自动激活?

\n

长版

\n

我正在拥抱“多语言”数据科学风格,这意味着同时使用 python 和 R。现在venv太棒了,renv太棒了,jupyterlab太棒了,所以我试图找出将它们一起使用的巧妙方法。

\n

快要完成了,所以可能一些提示就足以完成这个设置。这就是我现在所在的地方。

\n

系统

\n

从干净的操作系统开始,并安装系统级要求:R + renv 和 Python + venv。例如在 Ubuntu 上,它大约是这样的:

\n
# R\nsudo apt install r-base\nsudo R -e "install.packages(\'renv\')"\n\n# Python\nsudo apt install python3.8\nsudo apt install python3.8-venv\n
Run Code Online (Sandbox Code Playgroud)\n

项目

\n

现在创建一个包含两个文件的基本项目jupyrenv

\n
jupyrenv/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 DESCRIPTION\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n

DESCRIPTION包含 R 依赖项:

\n
Suggests:\n    IRkernel,\n    fortunes\n
Run Code Online (Sandbox Code Playgroud)\n

requirements.txt包含 python 依赖项:

\n
jupyterlab\n
Run Code Online (Sandbox Code Playgroud)\n

创建虚拟环境并安装依赖项(顺序很重要,R 必须遵循 python):

\n
jupyrenv/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 DESCRIPTION\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n

到目前为止非常整洁!

\n

朱皮特

\n

从命令行启动 jupyter 并庆幸,它有效了!

\n
jupyter-lab\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

有什么不喜欢的?

\n

不幸的是,如果我创建一个文件夹(例如notebooks)并在那里启动 R 笔记本,它\n不起作用:(

\n
[I 2022-02-23 19:07:24.628 ServerApp] Creating new directory in \n[I 2022-02-23 19:07:31.159 ServerApp] Creating new notebook in /notebooks\n[I 2022-02-23 19:07:31.416 ServerApp] Kernel started: 0aa2c276-18dc-4511-b308-e78234fa71d4\nError in loadNamespace(name) : there is no package called \xe2\x80\x98IRkernel\xe2\x80\x99\nCalls: :: ... loadNamespace -> withRestarts -> withOneRestart -> doWithOneRestart\nExecution halted\n
Run Code Online (Sandbox Code Playgroud)\n

尝试修复

\n

似乎renv没有从子文件夹中使用它,因此我们需要提示进程R使用它。我尝试在子文件夹中添加一个额外的.Rprofile文件notebooks

\n
jupyrenv/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 DESCRIPTION\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 renv\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 venv\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 notebooks\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .Rprofile\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Untitled.ipynb\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .Rprofile\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Untitled.ipynb\n
Run Code Online (Sandbox Code Playgroud)\n

包含以下内容:

\n

.Rprofile:

\n
source("../renv/activate.R")\n
Run Code Online (Sandbox Code Playgroud)\n

确实有效,但不是真的。首先,当尝试在notebooks目录中创建 R 笔记本时,它会创建一个新的renv

\n
[I 2022-02-23 19:22:28.986 ServerApp] Creating new notebook in /notebooks\n[I 2022-02-23 19:22:29.298 ServerApp] Kernel started: b40a88b3-b0bb-4839-af45-85811ec3073c\n# Bootstrapping renv 0.15.2 --------------------------------------------------\n* Downloading renv 0.15.2 ... OK (downloaded source)\n* Installing renv 0.15.2 ... Done!\n* Successfully installed and loaded renv 0.15.2.\n
Run Code Online (Sandbox Code Playgroud)\n

然后那个 jupyter 实例就可以工作了,我可以使用它,但是如果我重新启动,它就会停止工作并返回到丢失的错误IRkernel

\n
[I 2022-02-23 19:24:58.912 ServerApp] Kernel started: 822d9372-47fd-43f5-8ac7-77895ef124dc\nError in loadNamespace(name) : there is no package called \xe2\x80\x98IRkernel\xe2\x80\x99\nCalls: :: ... loadNamespace -> withRestarts -> withOneRestart -> doWithOneRestart\n
Run Code Online (Sandbox Code Playgroud)\n

我缺少什么?

\n

psa*_*rka 5

我在github 存储库中将这个问题作为一个问题renv打开,维护者友好地提供了一个解决方法。其内容notebooks/.Rprofile应如下:

owd <- setwd(".."); source("renv/activate.R"); setwd(owd)
Run Code Online (Sandbox Code Playgroud)

它融合了!