代码之家  ›  专栏  ›  技术社区  ›  Raniere Silva

如何从r网状调用python方法

  •  4
  • Raniere Silva  · 技术社区  · 7 年前

    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
    

    如何从Dictionary类调用其中一个方法,例如 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'
    

    但两次尝试都失败了。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Artem Sokolov    7 年前

    如中所述 Type Conversions ,python的dict对象在r中变为命名列表,因此,要访问r中相当于“dictionary keys”的内容,需要使用 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']