有什么方法可以使用网状结构在 r 中调用 base python 函数吗?

Is there any way to call base python function in r using reticulate?

我从 python 函数中得到了一个“生成器对象”。但是,我尝试了很多方法,但未能使用 reticulate 读取 r 中的“generator object”。我知道 python 基函数 list() 可以将“生成器对象”转换为“json”,这然后我可以在 r 中阅读。我想知道如何在 r 中使用 base python 函数? (我不想使用 py_run_file

例如:

>library(reticulate)
>foo <- import("foo")
>res <- foo.func()
<generator object at 0x7fd4fe98ee40>

谢谢!

我不确定你是否可以直接在 R 中,但你肯定可以在 R Markdown 中。我使用 R Markdown 在两者之间来回翻转对象。

我使用基本的 html_document YAML 输出。然而,我通常不会编织这种类型的 RMD,所以我认为如果你以相同的方式使用它,那么放在那里并不重要。

当你使用reticulate你需要一个环境。

所以首先我要一个 R 块:

```{r setup}

library(tidyverse) # for random r object creation to use in Python
library(reticulate)
use_virtualenv("KerasEnv") # this is an environment I already have setup

# creating R objects to use with Python
str(diamonds)

cut <- diamonds$cut %>% unique()

```

然后我将创建我的 Python 块。

```{r usingPy,results="asis",engine="python"}
    
import numpy as np
import random

diamonds_py = r.diamonds # bring dataset into Python

mxX = max(diamonds_py.x) # create a new Python object to bring into R
print(mxX)
# 10.74

cut_py = r.cut # bring vector into Python 

```

现在假设我想把 Python 的东西带回 R。

```{r tellMeMore}
# bring Python object into R
mxX_r = py $ mxX
# [1] 10.74 

```

您可以 运行 Python 和 R 代码逐行、逐块或编织。要清除 Python 环境,我很确定您必须重新启动 RStudio。

您可以使用 iterateiter_next

例如,考虑一个 python 生成器 firstn.py:

def firstn(n):
  num = 0
  while num < n:
    yield num
    num += 1

你可以 traverse the generator 或者 iterate :

library(reticulate)
source_python('firstn.py')
gen <- firstn(10)
gen
#<generator object firstn at 0x0000020CE536AF10>

result <- iterate(gen)
result
# [1] 0 1 2 3 4 5 6 7 8 9

iter_next:

iter_next(gen)
[1] 0
iter_next(gen)
[1] 1
iter_next(gen)
[1] 2