如何从R网状结构调用Python方法

时间:2018-06-29 20:06:46

标签: python r reticulate

reticulate使您可以与R中的Python交互。在Python中,通常使用(类)方法与变量进行交互。使用网状结构时,如何在R中访问/执行一个Python变量的方法?例如,如果我创建以下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 :(得分:2)

正如Type Conversions中指出的那样,Python的dict对象成为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']

答案 1 :(得分:0)

对原始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)字典值:

enter image description here

使用r_to_py()观察从R对象到Python对象的转换。

如果您想更深入地研究,也可以这样做:

```{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