Как вызвать метод Python из R сетчатки - PullRequest
0 голосов
/ 29 июня 2018

reticulate позволяет вам взаимодействовать с Python из R. В Python обычно используются (класс) методы для взаимодействия с вашими переменными. Как мне получить доступ / выполнить метод одной переменной Python в R при использовании reticulate? Например, если я создаю следующий словарь Python:

```{python}
fruits = {
    "apple": 53,
    "banana": None,
    "melon": 7,
}
```

, доступный через сетку,

```{r}
py$fruits
```

## $apple
## [1] 53
## 
## $banana
## NULL
## 
## $melon
## [1] 7

Как я могу вызвать один из методов из словарного класса, например, keys() от R?

```{python}
print(fruits.keys())
```

## dict_keys(['apple', 'banana', 'melon'])

Я пытался:

```{r error=TRUE}
py$fruits$keys()
```

## Error in eval(expr, envir, enclos): attempt to apply non-function

```{r error=TRUE}
py$fruits.keys()
```

## Error in py_get_attr_impl(x, name, silent): AttributeError: module '__main__' has no attribute 'fruits.keys'

, но обе попытки не удаются.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Применение небольшого самоанализа к исходному фрагменту Python:

```{python}
fruits = {
"apple": 53,
"banana": None,
"melon": 7,
}
```

В другом блоке R:

```{r}
py_fruits <- r_to_py(py$fruits)
py_list_attributes(py_fruits)
py_fruits$keys()
py_fruits$items()
```

Вы получите (1) все атрибуты, доступные для объекта Python, (2) ключи dict; (3) диктовочный предмет; и (4) значения dict:

enter image description here

Наблюдайте за преобразованием объекта R в Python с помощью r_to_py().

Если вы хотите копать глубже, вы также можете сделать это:

```{r}
library(reticulate)
builtins    <- import_builtins()

builtins$dict$keys(py$fruits)     # keys
builtins$dict$items(py$fruits)    # items
builtins$dict$values(py$fruits)   # values

enter image description here

0 голосов
/ 29 июня 2018

Как указано в Преобразования типов , объекты dict Python становятся именованными списками в R. Таким образом, чтобы получить доступ к эквиваленту «словарных ключей» в R, вы должны использовать names:

```{r}
names(py$fruits)
```
## [1] "melon"  "apple"  "banana"

Вы можете преобразовать результат обратно в dict -подобный объект, используя reticulate::dict(). Полученный объект будет функционировать так, как вы хотите:

```{r}
reticulate::dict( py$fruits )
```
## {'melon': 7, 'apple': 53, 'banana': None}

```{r}
reticulate::dict( py$fruits )$keys()
```
## ['melon', 'apple', 'banana']
...