34

reticulate包 | 在Rmarkdown中调用Python代码

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI1MTE2ODg4MA%3D%3D&%3Bmid=2650074512&%3Bidx=1&%3Bsn=b096ab63bc2f39df8f7d275906962004
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

腾讯课堂 |  Python网络爬虫与文本分析

v2Q7biM.jpg!mobile

Python和R是一对数据科学两大语言,在互联互通的路上,我感觉R更加的积极。还记得之前 Python中调用R的库-rpy2 , 在Python使用R语言语法还是有些不自然。在R中调用Python体验十分棒,一起跟我看看吧。

reticulate包是可以让R语言非常流畅自然联通Python的关键。

Rmarkdown预备知识

Rmarkdown很像jupyter notbeook和markdown的结合。

  • 代码块

  • markdon文本

代码块

在Rmarkdown中的代码块的开始都是以三引号、{}和语言名为标志,以三引号结尾。

```{r}
library(ggplot2)
ggplot(mpg, aes(x=displ, y=cty))+
geom_point()
```

niUn6vb.png!mobile

后面设置好reticulate包后,就可以在Rmarkdown中使用python代码块,

```{python}
import pandas as pd
df = pd.read_csv('test.csv')
df.head()```

markdown文本

文本部分全部支持markdown语法,这里不做赘述。

安装

```{r}
install.packages("reticulate")
```

环境设置

当我们在R代码块中设置好Python环境,就可以在Rmarkdown中跑Python代码。

查询Python

首先我们需要知道Python安装路径,可以在 命令行 中逐行执行下面代码

python3
import sys
sys.executable

我的mac电脑的Python安装路径为

/Library/Frameworks/Python.framework/Versions/3.7/bin/python3

指定Python

执行下方的代码(路径改为自己的Python安装路径)

```{r}
library(reticulate)

use_python('/Library/Frameworks/Python.framework/Versions/3.7/bin/python3')```

执行代码后,我们就可以愉快的使用Python代码

运行Python代码

在Rmarkdown中写Python代码块

作图

```{python}
import numpy as np
import matplotlib.pyplot as plt
# 计算正弦曲线上点的 x 和 y 坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
plt.title("sine wave form")
# 使用 matplotlib 来绘制点
plt.plot(x, y)
plt.show()
```

6RFz6j.png!mobile

读取csv

```{python}
import pandas as pd

df = pd.read_csv("test.csv", encoding="gbk")
df.head()```

eArArie.png!mobile

返回的df是Python对象,我们可以看到表格不好看,这是R中的Python对象。

在R代码块中调用Python变量(对象)

刚刚讲的都是在Rmakdown中运行Python代码块,并不是在R代码块中运行Python代码或者调用Python变量。

py$python_variable_name

R代码块中调用Python方法

py$python_variable_name

  • py相当于Python中的对象

  • $ 相当于Python中的

  • python_variable_name 是Python代码块中的变量名

比如在上文中Python的变量df,在R中调用

```{r}
py$df ```

iy2EviY.png!mobile

现在调用Python对象df时,R会默认将其转为R对象,所以内容一样,样式似乎变好看了。

R代码块中导入Python库

使用os库的listdir函数查询当前项目文件夹内的文件列表

```{python}
import os

os.listdir()```
['reticulate学习.md', 'test.csv', 'test.py', 'reticulate学习.html', 'reticulate学习_files', 'reticulate.pdf', 'reticulate学习.Rmd', 'data.py']

在R代码块中实现上方的Python功能,如下,很简单

```{r}
library(reticulate)

#导入库
os <- import("os")

#os库的listdir函数
os$listdir()
```
## [1] "reticulate学习.md"    "test.csv"             "test.py"             
## [4] "reticulate学习.html"  "reticulate学习_files" "reticulate.pdf"      
## [7] "reticulate学习.Rmd"   "data.py"

可以发现

  • import("os) 代替了 import os
  • $ 代替了 .
  • <- 代替了 =

再熟悉一下

```{r}
library(reticulate)
pd <- import("pandas")
df2 <- pd$read_csv("test.csv", encoding="gbk")
df2
```

3qQ3mqe.png!mobile

需要注意的是,在R代码块中执行Python代码时,默认会将Python对象转为R对象。

source_python()

使用reticulate包中的source_python('py文件路径')可以导入py文件中的变量,这样就可以在R代码块中使用外部变量。例如我在data.py中准备A和B两个字符串

A = '我是张三,'
B = '来自河北'

在R代码块中运行data.py

```{r}
library(reticulate)

source_python("data.py")
print(A)
print(B)
paste0(A, B)
```
我是张三,
来自河北
我是张三,来自河北

py_run_file()

在R代码块中运行项目文件夹中的test.py文件,该文件内只有

print('这是来自test.py的问候!')'

这一行代码,在代码块中运行```{r}
library(reticulate)
py_run_file("test.py")
```
得到
这是来自test.py的问候!

数据类型对比

zuqMjqA.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK