问题描述
我正在尝试使用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()
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环境和软件包。我通过执行以下操作解决了我的问题。
- 从R中删除网状包
- 打开Anaconda Navigator,然后从环境页面中删除r网状环境。我还删除了使用网状结构创建的其他conda环境。
- 重新安装网状软件包并运行代码
如果您仍然希望通过网状结构使用matplotlib,这不会有太大帮助,但是如果它不使用matplotlib,则至少应至少使脚本再次运行。