使用rpy2加载R包时,R内核崩溃

5

首先,我是rpy2 / jupyter的新手,请不要在这里问我的问题,如果不正确,请不要批评我。

我正在尝试设置使用R和Python进行数据分析的集成工作流程,并遇到以下错误:

我正在运行Ubuntu 19.04上的conda环境,使用Jupyter 1.0.0、Python 3.7.4、R 3.5.1、r-irkernel 1.0.2和rpy2 3.1.0,并通过R安装了R包Seurat。

当我使用R-kernel创建Jupyter笔记本时,我可以使用 library(Seurat) 加载 Seurat。

我也可以使用rpy2和rmagic在Python中使用R代码,例如:

%load_ext rpy2.ipython

%%R
data(allen, package = 'scRNAseq')
adata_allen <- as(allen, 'SingleCellExperiment')

然而,当我尝试使用rpy2加载Seurat时,内核崩溃:

%%R
library(Seurat)

我收到以下消息:

内核重新启动
看起来内核已经死亡,它将自动重启

Jupyter在命令行中给出以下消息:

[I 16:39:01.388 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports
kernel 23284ec0-63d5-4b61-9ffa-b52d19851eab restarted

请注意,像library(dplyr)这样的其他库可以使用rpy2正常加载。
完整的conda环境可以在附加的文本文件中找到。
我只是无法弄清楚是什么原因导致了问题。是否有一种方法可以从Jupyter获得更详细的错误消息?
非常感谢您的帮助!
问候 Felix

这听起来像是Seurat和/或(更可能的是)Jupyter R内核中的一个错误。它应该在他们的错误跟踪器中报告。 - Konrad Rudolph
5个回答

4

**这是对原回答的编辑 - segfault不应再发生。**

R软件包Seurat使用另一个名为reticulate的R软件包,提供了从R到Python的桥梁。

由于rpy2侧的cffi释放了Python GIL,并且reticulate侧没有确保获得GIL,因此长时间以来出现了segfault问题。但是,当前(2023年)版本的rpy2和reticulate应该可以一起使用。


1
感谢您的回复!在阅读您发布的帖子后,我按照一些建议降级到了Seurat 3.0.2版本,并成功解决了问题!非常感谢! - fkoegel

3

我也遇到了同样的问题,我正在使用在docker中的Jupyter笔记本和Python。

我通过以下方式启动我的笔记本或Python代码来解决内核崩溃问题:

import os \
os.environ['R_HOME'] = '/usr/lib/R'

/usr/lib/R 是我系统中安装 R 和库的位置,应该是 rpy2 所需的 R 版本。希望这可以帮到你。


这个解决方案让我受到启发,在Windows中手动设置每个env变量(R_HOME, R_LIBS_USER, R_USER),然后重新启动终端和Jupyter来解决问题。也许将来的版本会在安装过程中自动设置这些环境变量。 - undefined

1

我尝试在带有Python 3.10.5、IPython 8.4.0和R 4.1.3的 Docker镜像中安装rpy2

如果我使用pip在终端窗口中安装rpy2

python3 -m pip install rpy2

我在终端中启动IPython,并输入import rpy2,这一步骤成功了。但是下一步,即:import rpy2.robjects as robjects会导致以下不太具有指导性的错误信息:

Error in glue(.Internal(R.home()), "library", "base", "R", "base", sep = .Platform$file.sep) : 
  4 arguments passed to .Internal(paste) which requires 3
Error: could not find function "attach"
Error: object '.ArgsEnv' not found
Fatal error: unable to initialize the JIT

原因是PyPI上的rpy2包与jupyter/r-notebook镜像中的Python和R安装之间存在一些微妙的不兼容性。这种不兼容性是由于在r-notebook镜像中使用Conda安装了Python和R所致。
如果我也使用Conda安装rpy2,就像这样:
conda install --yes rpy2

然后一切都按照广告所说的那样运作。

学到的经验

  1. 如果Python和R是通过操作系统软件包安装的,则可以使用pip安装rpy2。
  2. 如果Python和R是通过Conda安装的,则也应该使用Conda安装rpy2。
  3. (最尴尬的部分):有一个jupyter/datascience-notebook,它预装了rpy2(以及许多其他好东西),无需安装任何东西:

jupyter/datascience-notebook包括来自Julia、Python和R社区的数据分析库。

jupyter/scipy-notebook和jupyter/r-notebook图像中的所有内容及其祖先图像rpy2包Julia编译器和基本环境IJulia支持在Jupyter笔记本中编写Julia代码HDF5、Gadfly、RDatasets包


0

在使用rpy2导入robjects时,我遇到了内核死机的问题,以下方法对我有效:

import os
os.environ['R_HOME'] = '/Users/<your user>/anaconda3/envs/<env name>/lib/R'

# import your desired module
from rpy2.robjects.packages import importr

0
我跟你遇到了同样的问题。但是我降级到Seurat 3.0.2,问题就得到了解决。要在conda中使用rpy2的用户定义R内核,请在最开始之前运行以下代码(在import rpy2之前)。
# user defined R installation
import os
os.environ['R_HOME'] = '/path/to/miniconda/envs/seurat/lib/R' #path to your R installation
os.environ['R_USER'] = '/path/to/miniconda/lib/python3.7/site-packages/rpy2' #path depends on where you installed Python.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接