Python 来自 RMarkdown - Matplotlib 问题

Python from RMarkdown - Matplotlib problems

我正在尝试在 RMarkdown 文档中使用 reticulate 到 运行 一些简单的 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'

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

Error in if (has_compatible_arch && has_preferred_numpy) valid_python_versions <- c(valid_python_versions, : missing value where TRUE/FALSE needed

traceback() 给了我来自 reticulate.so 的 CPP 堆栈跟踪,这是不可解释的。

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

系统信息:

在我原来的问题中,我提到了 this 问题,其中有人建议将 matplotlib 降级到版本 3.2.0,因为 reticulate 不是最新的 matplotlib 的变化。我进一步跟进了该建议并找到了解决方案(目前)。

TL;DR

删除 pip 和 conda 安装版本的 matplotlib,然后使用 conda 安装 matplotlib 版本 3.2.2 (不是 pip) 解决了问题。用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 提供了一个可以很好地与 reticulate 配合使用的 matplotlib 版本。但是,我现在不知道有什么区别。

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

  1. 从 R 中删除网状包
  2. 打开 Anaconda Navigator 并从环境页面中删除 r-reticulate 环境。我还删除了我使用 reticulate 创建的额外 conda 环境。
  3. 重新安装网状包和运行你的代码

如果您仍然想将 matplotlib 与 reticulate 一起使用,这不会有太大帮助,但如果它不使用 matplotlib,它至少应该让您的脚本再次 运行ning。