R 与 Python 的接口
reticulate 包提供了一套全面的工具,用于实现 Python 和 R 之间的互操作性。该包包括以下功能:
-
通过多种方式从 R 调用 Python,包括 R Markdown、执行 Python 脚本、导入 Python 模块,以及在 R 会话中交互式使用 Python。
-
在 R 和 Python 对象之间进行转换(例如,R 和 Pandas 数据框之间,或 R 矩阵和 NumPy 数组之间)。
-
灵活绑定不同版本的 Python,包括虚拟环境和 Conda 环境。
Reticulate 在 R 会话中嵌入了一个 Python 会话,实现了无缝、高性能的互操作性。如果你是一个在工作中使用 Python 的 R 开发者,或者是一个同时使用两种语言的数据科学团队成员,reticulate 可以显著简化你的工作流程!
入门
安装
从 CRAN 安装 reticulate 包:
install.packages("reticulate")
Python 版本
默认情况下,reticulate 使用名为 "r-reticulate" 的独立 Python 虚拟环境。
你可以使用 use_python()
函数指定其他 Python 版本,例如:
library(reticulate)
use_python("/usr/local/bin/python")
use_virtualenv()
和 use_condaenv()
函数允许你指定虚拟环境或 Conda 环境中的 Python 版本,例如:
library(reticulate)
use_virtualenv("myenv")
有关更多详细信息,请参阅 Python 版本配置 文章。
Python 包
你可以使用标准的 shell 工具(如 pip
和 conda
)安装所需的 Python 包。或者,reticulate 包含了一套用于在虚拟环境和 Conda 环境中管理和安装包的函数。有关更多详细信息,请参阅 安装 Python 包 文章。
调用 Python
有多种方法可以将 Python 代码集成到你的 R 项目中:
-
R Markdown 中的 Python — R Markdown 的新 Python 语言引擎,支持 R 和 Python 之间的双向通信(R 代码块可以访问 Python 对象,反之亦然)。
-
导入 Python 模块 —
import()
函数允许你导入任何 Python 模块,并直接从 R 调用其函数。 -
执行 Python 脚本 —
source_python()
函数允许你执行 Python 脚本,就像使用source()
执行 R 脚本一样(脚本中定义的 Python 函数和对象可以直接在 R 会话中使用)。 -
Python REPL —
repl_python()
函数在 R 中创建一个交互式 Python 控制台。你在 Python 中创建的对象可以在 R 会话中使用(反之亦然)。
以下将详细解释每种技术。
R Markdown 中的 Python
reticulate 包为 R Markdown 提供了一个 Python 引擎,具有以下特性:
-
在嵌入 R 会话的单个 Python 会话中运行 Python 代码块(Python 代码块之间共享变量/状态)
-
打印 Python 输出,包括来自 matplotlib 的图形输出。
-
使用
py
对象从 R 访问在 Python 代码块中创建的对象(例如,py$x
可以从 R 访问在 Python 中创建的x
变量)。 -
使用
r
对象从 Python 访问在 R 代码块中创建的对象(例如,r.x
可以从 Python 访问在 R 中创建的x
变量)
提供了许多 Python 对象类型的内置转换,包括 NumPy 数组和 Pandas 数据框。例如,你可以使用 Pandas 读取和处理数据,然后使用 ggplot2 轻松绘制 Pandas 数据框:
请注意,只要安装了 reticulate,R Markdown 中的 reticulate Python 引擎默认就会启用。
有关更多详细信息,请参阅 R Markdown Python 引擎 文档。
导入 Python 模块
你可以使用 import()
函数导入任何 Python 模块并从 R 中调用它。例如,以下代码导入 Python 的 os
模块并调用 listdir()
函数:
library(reticulate)
os <- import("os")
os$listdir(".")
[1] ".git" ".gitignore" ".Rbuildignore" ".RData"
[5] ".Rhistory" ".Rproj.user" ".travis.yml" "appveyor.yml"
[9] "DESCRIPTION" "docs" "external" "index.html"
[13] "index.Rmd" "inst" "issues" "LICENSE"
[17] "man" "NAMESPACE" "NEWS.md" "pkgdown"
[21] "R" "README.md" "reticulate.Rproj" "src"
[25] "tests" "vignettes"
可以通过 $
运算符访问 Python 模块和类中的函数和其他数据(类似于你与 R 列表、环境或引用类交互的方式)。
导入的 Python 模块支持代码补全和内联帮助:
有关从 R 中与 Python 对象交互的更多详细信息,请参阅 从 R 调用 Python。
执行 Python 脚本
你可以使用 source_python()
函数执行任何 Python 脚本,就像使用 source()
执行 R 脚本一样。例如,如果你有以下 Python 脚本 flights.py:
import pandas
def read_flights(file):
flights = pandas.read_csv(file)
flights = flights[flights['dest'] == "ORD"]
flights = flights[['carrier', 'dep_delay', 'arr_delay']]
flights = flights.dropna()
return flights
那么你可以执行该脚本并按如下方式调用 read_flights()
函数:
source_python("flights.py")
flights <- read_flights("flights.csv")
library(ggplot2)
ggplot(flights, aes(carrier, arr_delay)) + geom_point() + geom_jitter()
有关源Python代码的更多细节,请参阅source_python()
文档。
Python REPL
如果你想交互式地使用Python,可以调用repl_python()
函数,它在R会话中提供了一个嵌入式Python REPL。在Python REPL中创建的对象可以通过reticulate导出的py
对象从R中访问。例如:
在Python REPL中输入exit
可以返回R提示符。
请注意,Python代码也可以使用r
对象(如r.flights
)访问R会话中的对象。有关使用嵌入式Python REPL的更多详细信息,请参阅repl_python()
文档。
类型转换
在调用Python时,R数据类型会自动转换为相应的Python类型。当值从Python返回到R时,它们会被转换回R类型。类型转换如下:
R | Python | 示例 |
---|---|---|
单元素原子向量 | 标量 | 1 , 1L , TRUE , "foo" |
无名列表或多元素原子向量 | 列表 | c(1.0, 2.0, 3.0) , c(1L, 2L, 3L) |
有名列表 | 字典 | list(a = 1L, b = 2.0) , dict(x = x_data) |
矩阵/数组 | NumPy ndarray | matrix(c(1,2,3,4), nrow = 2, ncol = 2) |
数据框 | Pandas DataFrame | data.frame(x = c(1,2,3), y = c("a", "b", "c")) |
函数 | Python函数 | function(x) x + 1 |
NULL, TRUE, FALSE | None, True, False | NULL , TRUE , FALSE |
如果返回的是自定义类的Python对象,则会返回该对象的R引用。你可以像使用R引用类实例一样调用该对象的方法和访问其属性。
学习更多
以下文章涵盖了使用reticulate的各个方面:
-
从R调用Python — 描述了从R访问Python对象的各种方法,以及用于更高级交互和转换行为的可用函数。
-
R Markdown Python引擎 — 提供了在R Markdown文档中使用Python代码块的详细信息,包括如何从R代码块调用Python代码,反之亦然。
-
Python版本配置 — 描述了在R会话中确定reticulate使用哪个Python版本的设施。
-
安装Python包 — 关于从PyPI或Conda安装Python包,以及使用virtualenvs和Conda环境管理包安装的文档。
-
在R包中使用reticulate — 在R包中使用reticulate的指南和最佳实践。
-
R和Python中的数组 — 关于R和Python中数组差异及其对转换和互操作性影响的高级讨论。
-
Python入门 — 为R用户介绍Python。
为什么叫reticulate?
根据维基百科上关于网纹蟒的文章:
网纹蟒是一种在东南亚发现的蟒蛇。它们是世界上最长的蛇类和最长的爬行动物……学名reticulatus是拉丁语,意为"网状"或"网纹",指的是其复杂的颜色图案。
根据韦氏词典对reticulate的定义:
1:类似网络或网状;特别是:具有横穿的脉络、纤维或线条的网状叶。2:涉及依赖于包含多样交配群体的基因重组的进化变化。
该包使你能够将Python代码reticulate(编织)到R中,创造一个将两种语言交织在一起的新型项目。