reticulate 是 R 的一个程序包,允许在 R 中使用 Python。该包本质上是提供了本地 Python 环境的 R 接口,在 R 中调用该接口完成 Python 代码的执行。
该包提供以下几种方式在 R 中执行 Python:
R 中调用 Python 模块完成一些操作
在 Rmarkdown 的 Cell 中直接运行 Python 代码
Python Cell 和 R Cell 创建的对象可以相互转化、访问
Python Cell 的结果可以打印出来,包括 matplotlib 图形输出
在 R 中执行 Python 脚本:*.py
在 R 脚本中执行 Python 代码片段
library(reticulate)
1、配置 Python 环境
有四种配置方式,具体查看官方教程
use_python()
use_condaenv()
use_virtualenv()
use_miniconda()
py_config()
miniconda 环境
如果不太懂如何配置 Python 环境,推荐一行代码安装 miniconda 环境,之后便可在 R 中执行 Python
install_miniconda()
miniconda_path()
miniconda_update()
2、在 R 中调用 Python 模块
os <- import(“os”)
os$listdir("./")
[1] “.Rproj.user” “convert.R” “reticulate.Rmd” “Reticulate.Rproj”
[5] “Rscript.R” “summary.html” “summary.md” “summary.nb.html”
[9] “summary.Rmd” “test_pyscript.py”
sns <- import(“seaborn”)
tips <- sns$load_dataset(“tips”)
print(head(tips))
total_bill tip sex smoker day time size
1 16.99 1.01 Female No Sun Dinner 2
2 10.34 1.66 Male No Sun Dinner 3
3 21.01 3.50 Male No Sun Dinner 3
4 23.68 3.31 Male No Sun Dinner 2
5 24.59 3.61 Female No Sun Dinner 4
6 25.29 4.71 Male No Sun Dinner 4
在 R 中安装 python 模块
py_install(“seaborn”, pip = T)
py_module_available(“seaborn”)
[1] TRUE
3、在 RMarkdown 中直接使用 Python
注意 Cell 要设置为 {python}
import seaborn as sns
tips = sns.load_dataset(“tips”)
tips.head()
sns.scatterplot(x=“total_bill”, y=“tip”, data=tips, hue=“smoker”)
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
Rmarkdown 中 Python 与 R 对象相互调用
设置一些 R 对象(R Cell)
x <- c(1, 2, 3)
y <- data.frame(a = c(1, 2), b = c(3, 4))
Python 中调用上述 R 对象(Python Cell)
r.x
[1.0, 2.0, 3.0]
r.y
a b
0 1.0 3.0
1 2.0 4.0
设置一些 Python 对象(Python Cell)
import pandas as pd
m = [1, 2, 3]
n = pd.DataFrame([[1, 2], [3, 4]], columns=[“a”, “b”])
R 中调用上述 Python 对象(R Cell)
py$m
[1] 1 2 3
py$n
a b
1 1 2
2 3 4
Python 与 R 对象相互转换的方式
R [公式] Python
设置一些 R 对象(R Cell)
A <- 1
B <- c(1, 2, 3)
C <- c(a = 1, b = 2, c = 3)
D <- matrix(1:4, nrow = 2)
E <- data.frame(a = c(1, 2), b = c(3, 4))
G <- list(1, 2, 3)
H <- list(c(1, 2), c(3, 4))
I <- list(a = c(1, 2), b = c(3, 4))
J <- function(a, b) {
return(a + b)
}
K1 <- NULL
K2 <- T
K3 <- F
上述 R 对象转为 Python 对象(Python Cell)
r.A
1.0
type(r.A)
r.B
[1.0, 2.0, 3.0]
type(r.B)
r.C
[1.0, 2.0, 3.0]
type(r.C)
r.D
array([[1, 3],
[2, 4]])
type(r.D)
r.E
a b
0 1.0 3.0
1 2.0 4.0
type(r.E)
r.G
[1.0, 2.0, 3.0]
type(r.G)
r.H
[[1.0, 2.0], [3.0, 4.0]]
type(r.H)
r.I
{‘a’: [1.0, 2.0], ‘b’: [3.0, 4.0]}
type(r.I)
r.J
type(r.J)
r.J(2, 3)
5
r.K1
type(r.K1)
r.K2
True
type(r.K2)
r.K3
False
type(r.K3)
Python [公式] R
设置一些 Python 对象(Python Cell)
A = 1
B = [1, 2, 3]
C = [[1, 2], [3, 4]]
D1 = [[1], 2, 3]
D2 = [[1, 2], 2, 3]
E = (1, 2, 3)
FF = ((1, 2), (3, 4))
G = ((1, 2), 3, 4)
H = {“a”: [1, 2, 3],
“b”: [2, 3, 4]
}
I = {“a”: 1,
“b”: [2, 3, 4]
}
def J(a, b):
return a + b
上述 Python 对象转为 R 对象(R Cell)
py$A
[1] 1
class(py$A)
[1] “integer”
py$B
[1] 1 2 3
class(py$B)
[1] “integer”
py$C
[[1]]
[1] 1 2[[2]]
[1] 3 4
class(py$C)
[1] “list”
py$D1
[[1]]
[1] 1[[2]]
[1] 2[[3]]
[1] 3
class(py D 1 ) [ 1 ] " l i s t " p y D1) [1] "list" py D1)[1]"list"pyD2
[[1]]
[1] 1 2[[2]]
[1] 2[[3]]
[1] 3
class(py$D2)
[1] “list”
py$E
[[1]]
[1] 1[[2]]
[1] 2[[3]]
[1] 3
class(py$E)
[1] “list”
py$FF
[[1]]
[[1]][[1]]
[1] 1[[1]][[2]]
[1] 2[[2]]
[[2]][[1]]
[1] 3[[2]][[2]]
[1] 4
class(py$FF)
[1] “list”
py$G
[[1]]
[[1]][[1]]
[1] 1[[1]][[2]]
[1] 2[[2]]
[1] 3[[3]]
[1] 4
class(py$G)
[1] “list”
py$H
$a
[1] 1 2 3b [ 1 ] 234 c l a s s ( p y b [1] 2 3 4 class(py b[1]234class(pyH)
[1] “list”
py$I
$a
[1] 1b [ 1 ] 234 c l a s s ( p y b [1] 2 3 4 class(py b[1]234class(pyI)
[1] “list”
py$J
class(py J ) [ 1 ] " p y t h o n . b u i l t i n . f u n c t i o n " " p y t h o n . b u i l t i n . o b j e c t " p y J) [1] "python.builtin.function" "python.builtin.object" py J)[1]"python.builtin.function""python.builtin.object"pyJ(2, 3)
[1] 5
4、在 R 中执行 Python 脚本
假设 Python 脚本为 test_pyscript.py,内容见下:
for i in range(10):
print("hello world)
def sum_two_value(a, b):
return a + b
在 R 中执行 test_pyscript.py
source_python("./test_pyscript.py")
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
sum_two_value(1, 2)
[1] 3
5、在 R Console 中交互式运行 R
repl_python () 进入 Python 环境
exit 退出 Python 环境
6、R 中运行 Python 代码片段
py_run_string(“a = [1, 2, 3]; b = [2, 3, 4]; c = list(zip(a, b))”)