RMarkdown中的Python-Matplotlib问题

问题描述

我正在尝试使用reticulate在RMarkdown文档中运行一些简单的Python代码。我发现如果Matplotlib在conda环境中,则在尝试运行python代码块时会出错,但是我可以直接从R运行Python。这是我所见的简单示例:

---
title: "Reticulate Test"
date: "9/21/2020"
output: html_document
---

```{r setup,include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(reticulate)
use_condaenv('Toy_MPL') # this environment contain matplotlib and produces the error
#use_condaenv('Toy') # this environment does not contain matplotlib and no error
```

```{r}
# this works regardless of which environment I use
pysys <- import('sys')
pysys$version
```

[1] "3.8.5 (default,Sep  4 2020,02:23:17) \n[Clang 10.0.0 ]"

```{python,engine.path = '/opt/miniconda2/envs/Toy_MPL/bin/python'}
# if Toy_MPL conda environment is used,the error is generated
# if Toy conda environment is used,I get the same output as above
import sys
print(sys.version)
```
Error in py_call_impl(callable,dots$args,dots$keywords) : 
  TypeError: use() got an unexpected keyword argument 'warn'

我的第一个想法是,安装Matplotlib时,reticulate没有看到conda环境lib/文件夹中安装的各种系统库-Matplotlib附带了很多依赖项。我尝试了以下方法,但是没有用:

  • 在.Renviron中设置LD_LIBRARY_PATH指向正确的库路径。
  • use_python()之外或代替use_condaenv()呼叫engine.path
  • 在Python代码块中
  • 设置Error in if (has_compatible_arch && has_preferred_numpy) valid_python_versions <- c(valid_python_versions,: missing value where TRUE/FALSE needed
  • 我曾尝试将matplotlib降级到v3.2(建议here),但这导致了一系列新的错误

traceback()

  • 正在检查NumPy,我看到我有v1.19.1(其他错误提示需要> 1.6)。并且,重新安装matplotlib v3.3.1不会阻止该错误。完成此“修复”之后,我最终不得不重建整个环境。

update为我提供了来自reticulate.so的CPP堆栈跟踪,无法解释。

我的解释是,为RMarkdown创建的环境未指向正确的库位置,但是我无法确定如何正确设置它。

系统信息:

  • Mac OS Catalina 10.15.6
  • RStudio v1.3.1073
  • 网状v1.16
  • conda v4.8.4
  • conda环境v3.8.5中的Python
  • Toy_MPL环境v3.3.1中的Matplotlib

解决方法

在我最初的问题中,我提到了this问题,在该问题中,有人建议将matplotlib降级到3.2.0版,因为网状结构不符合matplotlib的最新要求。我进一步遵循了该建议,并找到了解决方案(目前)。

TL; DR

删除pip和conda安装的matplotlib版本,然后使用conda (非pip)安装matplotlib 3.2.2版可以解决此问题。使用pip安装matplotlib会导致其他错误。

详细信息

在对other question的答复中,建议这样做:

pip install matplotlib==3.2  

我尝试了此操作,但最终遇到了其他我也无法追踪的错误。所以,我卸载了matplotlib,然后用

重新安装了它。
pip install matplotlib==3.3.1

希望回到我原来的位置。这也行不通,新错误仍然存​​在。然后,我用pip完全删除了matplotlib,并使用conda重新安装了3.3.1版本:

pip uninstall matplolib
conda install matplotlib

这使我回到了matplotlib版本3.3.1和我在问题中提到的原始错误。然后,我尝试使用conda安装matplotlib 3.2版:

conda install matplotplib==3.2

安装的版本是3.2.2,而不是响应中建议的3.2.0,但是当我这样做时,原来的问题似乎已经解决了。

在这种情况下,pip和conda之间的依赖项解析显然有所不同,conda提供了matplotlib的一个版本,可以很好地与reticulate配合使用。但是,我目前不知道有什么区别。

,

我也遇到了类似的问题。我是python的新手,所以我使用Anaconda Navigator来管理我的python环境和软件包。我通过执行以下操作解决了我的问题。

  1. 从R中删除网状包
  2. 打开Anaconda Navigator,然后从环境页面中删除r网状环境。我还删除了使用网状结构创建的其他conda环境。
  3. 重新安装网状软件包并运行代码

如果您仍然希望通过网状结构使用matplotlib,这不会有太大帮助,但是如果它不使用matplotlib,则至少应至少使脚本再次运行。