如何设置自定义 R 安装以在 Jupyter 中使用 rpy2?

Mar*_*ker 2 kernel r rpy2 conda jupyter

我有一个 conda 环境,我通过运行将其作为内核提供给我的 Jupyter 实例: python -m ipykernel install --user --name my-env-name --display-name "Python (my-env-name)"

在这个环境中,我想在 Jupyter 中使用 R,利用rpy2's%load_ext rpy2.ipython命令来启用%%R魔法。但是,rpy2使用的是我的全局 R,而不是安装在我的 conda 环境中的 R。我通过以下方式检查了我的 R 家:

%%R
R.home()
Run Code Online (Sandbox Code Playgroud)

(我还可以检查情况%run -m rpy2.situation在Jupyter笔记本(),然而,这似乎被打破rpy2版本之间的某个地方3.1.03.2.1......至少对我来说,被扔UnboundLocalError: local variable 'rpy2' referenced before assignment3.1.0和它工作3.2.1)。

如何让我的 Jupyter 笔记本从我的 conda 环境加载 R 安装?

Mar*_*ker 7

有两种方法可以解决这个问题,一种是本地的(针对单个 Jupyter 笔记本),另一种是全局的(针对内核本身)。两者都与设置R_HOME环境变量有关。

本地来源):在调用%load_ext rpy2.ipythonJupyter notebook之前,运行:

import os
os.environ['R_HOME'] = '/home/your/anaconda3/envs/myenv/lib/R' #path to your R installation
Run Code Online (Sandbox Code Playgroud)

全局:通过以下方式找到您的内核目录:jupyter kernelspec list并编辑文件kernel.json. 通过添加更新 JSON: "env": {"R_HOME":"/home/your/anaconda3/envs/my-env-name/lib/R"},然后重新启动内核(您可能还必须重新启动 Jupyter)。

更新(搞砸了LD_LIBRARY_PATH

最近,我rpy2在使用以下命令设置新环境后再次尝试在 jupyter 中运行conda

conda config --add channels conda-forge
conda config --set channel_priority strict
conda create -n myenv python=3.7
conda activate myenv
conda install r-essentials pandas rpy2
Run Code Online (Sandbox Code Playgroud)

这次我在尝试%load_ext rpy2.ipython(Jupyter) 或简单地import rpy2.robjects(任何脚本)时遇到了以下问题:

>>> import rpy2.robjects                                            
Warning message:                                                    
package ‘methods’ was built under R version 3.6.3     
Error: package or namespace load failed for ‘stats’ in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object '/home/your/anaconda3/envs/myenv/lib/R/library/stats/libs/stats.so':                  
  /home/your/anaconda3/envs/myenv/lib/R/library/stats/libs/stats.so: undefined symbol: MARK_NOT_MUTABLE
During startup - Warning messages:                                                                                          
1: package ‘datasets’ was built under R version 3.6.3      
2: package ‘utils’ was built under R version 3.6.3                                                                     
3: package ‘grDevices’ was built under R version 3.6.3  
4: package ‘graphics’ was built under R version 3.6.3                                                                       
5: package ‘stats’ was built under R version 3.6.3          
6: package ‘stats’ in options("defaultPackages") was not found                                                       
R[write to console]: Error: package or namespace load failed for ‘tools’ in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object '/home/your/anaconda3/envs/myenv/lib/R/library/tools/libs/tools.so':
  /home/your/anaconda3/envs/myenv/lib/R/library/tools/libs/tools.so: undefined symbol: R_NewPreciousMSet

R[write to console]: Error in dyn.load(file, DLLpath = DLLpath, ...) :
  unable to load shared object '/home/your/anaconda3/envs/myenv/lib/R/library/tools/libs/tools.so':
  /home/your/anaconda3/envs/myenv/lib/R/library/tools/libs/tools.so: undefined symbol: R_NewPreciousMSet

R[write to console]: In addition:                                      
R[write to console]: Warning message:                        

R[write to console]: package ‘tools’ was built under R version 3.6.3

Traceback (most recent call last):                          
  File "<stdin>", line 1, in <module>                    
  File "/home/your/anaconda3/envs/myenv/lib/python3.7/site-packages/rpy2/robjects/__init__.py", line 20, in <module>
    import rpy2.robjects.functions                                           
  File "/home/your/anaconda3/envs/myenv/lib/python3.7/site-packages/rpy2/robjects/functions.py", line 12, in <module>
    from rpy2.robjects import help                                   
  File "/home/your/anaconda3/envs/myenv/lib/python3.7/site-packages/rpy2/robjects/help.py", line 43, in <module>
    tools_ns = _get_namespace(StrSexpVector(('tools',)))          
  File "/home/your/anaconda3/envs/myenv/lib/python3.7/site-packages/rpy2/rinterface_lib/conversion.py", line 44, in _
    cdata = function(*args, **kwargs)                                     
  File "/home/your/anaconda3/envs/myenv/lib/python3.7/site-packages/rpy2/rinterface.py", line 621, in __call__
    raise embedded.RRuntimeError(_rinterface._geterrmessage())                            
rpy2.rinterface_lib.embedded.RRuntimeError: Error in dyn.load(file, DLLpath = DLLpath, ...) :
  unable to load shared object '/home/your/anaconda3/envs/myenv/lib/R/library/tools/libs/tools.so':
  /home/your/anaconda3/envs/myenv/lib/R/library/tools/libs/tools.so: undefined symbol: R_NewPreciousMSet
Run Code Online (Sandbox Code Playgroud)

问题似乎是一个搞砸了的 R “情况”(通过%run -m rpy2.situationJupyter 或仅python -m rpy2.situation在命令行上检查),它R's additions to LD_LIBRARY_PATH:指向和旧的、全局安装的 R 版本。

我不得不手动取消设置LD_LIBRARY_PATH来解决这个问题。该路径可以类似地设置/取消设置R_HOME

PS:我在我的自定义(来自源代码)R 安装中找到R_HOMELD_LIBRARY_PATH设置了它.bashrc。这显然混淆了 Jupyter 内核。不聪明 ;)

PPS:rpy2.situation仍然告诉我有一个Warning: The environment variable R_HOME differs from the default R in the PATH.

Looking for R's HOME:
    Environment variable R_HOME: /home/your/anaconda3/envs/myenv/lib/R
    Calling `R RHOME`: /home/your/anaconda3/envs/jupyter-env/lib/R
    Environment variable R_LIBS_USER: None
    Warning: The environment variable R_HOME differs from the default R in the PATH.
Run Code Online (Sandbox Code Playgroud)

这让我担心,R实际上默认为 Jupyter 安装安装了 R。因此,如果有人对此发表评论,我将不胜感激。