4

reticulate允许您从 R 与 Python 交互。在 Python 中,通常使用(类)方法与变量进行交互。使用 reticulate 时如何访问/执行 R 中一个 Python 变量的方法?例如,如果我创建以下 Python 字典:

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

可以使用 reticulate 访问,

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

但两次尝试都失败了。

4

2 回答 2

4

正如Type Conversions中所指出的,Python 的 dict 对象成为 R 中的命名列表。因此,要访问 R 中的“字典键”等价物,您可以使用names

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

您可以选择使用 将结果转换回dict-like 对象reticulate::dict()。然后,生成的对象将按照您的需要运行:

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

```{r}
reticulate::dict( py$fruits )$keys()
```
## ['melon', 'apple', 'banana']
于 2018-06-29T20:47:10.353 回答
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) dict 值:

在此处输入图像描述

使用 .观察从 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

在此处输入图像描述

于 2019-07-09T21:18:00.977 回答