Reticulate не может получить доступ к переменным R в Python при вязании, если не выполняется в RStudio

#r #r-markdown #reticulate

#r #r-markdown #reticulate

Вопрос:

У меня есть документ RMarkdown со следующим содержимым:

 ```{r setup, include=FALSE}
library(reticulate)
```

```{r}
#These lines don't seem to make a difference, but I have seen them suggested elsewhere
reticulate::use_python('/usr/local/Cellar/python@3.8/3.8.6_2/bin/python3.8')
knitr::knit_engines$set(python = reticulate::eng_python)
```


```{r}
py <- reticulate::py
```


```{python}
import sys
sys.version

a = 1
```


```{r python from r}
print(py$a)
b <- 2
```

```{python r from python}
print(r.b)
```
 

Если я запускаю это в RStudio, либо в интерактивном режиме, либо путем вязания всего документа, все работает, и последний фрагмент печатает «2». Однако при запуске из консоли R через render (или мой рабочий скрипт, который выполняет регулярные тренировки модели) он завершается сбоем в последнем фрагменте со следующей ошибкой:

Ошибка в py_call_impl (вызываемый, точки $ аргументы, точки $ ключевые слова):
ошибка выполнения: ошибка оценки: объект ‘b’ не найден.

Подробная трассировка: файл «», строка 1, в файле «/Library/Frameworks/R.framework/Versions/3.6/Resources/library/reticulate/python/rpytools/call.py «, строка 21, в python_function вызывает RuntimeError(res[kErrorKey])

Доступ к переменным Python из R, кажется, работает правильно, но я не могу получить доступ к переменным R в Python.

Я использую Reticulate 1.18, Knitr 1.30 и rMarkdown 2.6. Вызов py_config() как из RStudio, так и из консоли R возвращает тот же результат:

>py_config()

python: /usr/local/Cellar/python@3.8/3.8.6_2/bin/python3.8 libpython:
/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/config-3.8-darwin/libpython3.8.dylib pythonhome:
/usr/local/Cellar/python@3.8/3.8.6_2/Frameworks/Python.framework/Versions/3.8:/usr/local/Cellar/python@3.8/3.8.6_2/Frameworks/Python.framework/Versions/3.8 версия: 3.8.6 (по умолчанию, ноябрь 20 2020, 18:29:40) [ Clang 12.0.0 (clang-1200.0.32.27)] numpy:
/usr/local/lib/python3.8/site-packages/numpy numpy_version: 1.18.5

ПРИМЕЧАНИЕ: версия Python была принудительно установлена RETICULATE_PYTHON

Ответ №1:

Похоже, что это нарушено в текущей версии Reticulate. Я понизил рейтинг до 1.16, и это исправило его, 1.17 и более поздние версии сломаны. Я отправил заявку разработчикам: https://github.com/rstudio/reticulate/issues/914

Редактировать: теперь это исправлено в последней версии разработчика, которую можно установить с помощью remotes ::install_github («rstudio / reticulate»)

Ответ №2:

Это случилось со мной, потому что у меня была глупая идея назвать объект r в скрипте RMarkdown

 ```{python}
import requests
r = requests.get('http://api.worldbank.org/v2/countries?incomeLevel=LMC')
r.content
```
 

будет работать в интерпретаторе python, но может возвращать ошибку в документе RMarkdown (потому reticulate что ищет объект content в среде python)

Лучшее решение: никогда не называть объект r при использовании reticulate