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 有效:
- 在 .Renviron 中设置 LD_LIBRARY_PATH 以指向正确的库路径。
- 调用
use_python()
作为 use_condaenv()
的补充或替代
- 在Python代码块中设置
engine.path
- 我尝试将 matplotlib 降级到 v3.2(建议 here),但这导致了一组新的错误:
Error in if (has_compatible_arch && has_preferred_numpy) valid_python_versions <- c(valid_python_versions, : missing value where TRUE/FALSE needed
- 检查 NumPy,我看到我有 v1.19.1(其他错误提示需要 >1.6)。并且,重新安装 matplotlib v3.3.1 并不能防止错误。在这个“修复”之后,我最终不得不重建整个环境。
traceback()
给了我来自 reticulate.so 的 CPP 堆栈跟踪,这是不可解释的。
我的解释是为 RMarkdown 创建的环境没有指向正确的库位置,但我无法确定如何正确设置它。
系统信息:
- Mac OS 卡特琳娜 10.15.6
- RStudio v1.3.1073
- 网纹 v1.16
- conda v4.8.4
- Python 在 conda 环境 v3.8.5
- Toy_MPL 环境中的 Matplotlib v3.3.1
在我原来的问题中,我提到了 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 环境和包。我通过执行以下操作解决了我的问题。
- 从 R 中删除网状包
- 打开 Anaconda Navigator 并从环境页面中删除 r-reticulate 环境。我还删除了我使用 reticulate 创建的额外 conda 环境。
- 重新安装网状包和运行你的代码
如果您仍然想将 matplotlib 与 reticulate 一起使用,这不会有太大帮助,但如果它不使用 matplotlib,它至少应该让您的脚本再次 运行ning。
我正在尝试在 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 有效:
- 在 .Renviron 中设置 LD_LIBRARY_PATH 以指向正确的库路径。
- 调用
use_python()
作为use_condaenv()
的补充或替代 - 在Python代码块中设置
engine.path
- 我尝试将 matplotlib 降级到 v3.2(建议 here),但这导致了一组新的错误:
Error in if (has_compatible_arch && has_preferred_numpy) valid_python_versions <- c(valid_python_versions, : missing value where TRUE/FALSE needed
- 检查 NumPy,我看到我有 v1.19.1(其他错误提示需要 >1.6)。并且,重新安装 matplotlib v3.3.1 并不能防止错误。在这个“修复”之后,我最终不得不重建整个环境。
traceback()
给了我来自 reticulate.so 的 CPP 堆栈跟踪,这是不可解释的。
我的解释是为 RMarkdown 创建的环境没有指向正确的库位置,但我无法确定如何正确设置它。
系统信息:
- Mac OS 卡特琳娜 10.15.6
- RStudio v1.3.1073
- 网纹 v1.16
- conda v4.8.4
- Python 在 conda 环境 v3.8.5
- Toy_MPL 环境中的 Matplotlib v3.3.1
在我原来的问题中,我提到了 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 环境和包。我通过执行以下操作解决了我的问题。
- 从 R 中删除网状包
- 打开 Anaconda Navigator 并从环境页面中删除 r-reticulate 环境。我还删除了我使用 reticulate 创建的额外 conda 环境。
- 重新安装网状包和运行你的代码
如果您仍然想将 matplotlib 与 reticulate 一起使用,这不会有太大帮助,但如果它不使用 matplotlib,它至少应该让您的脚本再次 运行ning。