如何从 R reticulate 调用 Python 方法

How to call Python method from R reticulate

reticulate 允许您与 R 中的 Python 交互。在 Python 中,通常使用 (class) 方法与变量交互。使用网状结构时,如何access/execute R 中一个Python 变量的方法?例如,如果我创建以下 Python 字典:

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

可以使用网状结构访问,

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

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

如何调用字典 class 中的方法之一,例如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'

但是两次尝试都失败了。

正如 Type Conversions 中指出的那样,Python 的字典对象在 R 中变成了命名列表。因此,要在 R 中访问等同于 "dictionary keys" 的内容,您可以使用 names:

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

您可以选择使用 reticulate::dict() 将结果转换回类似 dict 的对象。生成的对象将按照您的意愿运行:

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

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

对原始 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) 字典键; (3) 字典项;和 (4) 字典值:

观察从 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