R knitr:将 spin() 与 R 和 Python 代码一起使用
R knitr: use spin() with R and Python code
随着 reticulate 的出现,将 R 和 Python 结合在一个 .Rmd 文档中在 R 社区(包括我自己)中变得越来越流行。现在,我的个人工作流程通常从 R 脚本开始,在某些时候,我使用 knitr::spin()
创建一个可共享的报告,并将纯 .R 文档作为输入以避免代码重复(另请参见 Knitr's best hidden gem: spin有关该主题的更多信息)。
但是,一旦 Python 代码参与到我的分析中,我目前就被迫中断此工作流程并在编译之前手动将我的初始 .R 脚本转换(即复制和粘贴)为 .Rmd那个报告。我想知道,有没有人知道是否有可能——或者就此而言,是否有可能——让 knitr::spin()
在单个 .R 文件中同时使用 R 和 Python 代码块而不走这条弯路?我的意思是,就像在 .Rmd 文件中混合两种语言并在它们之间交换对象时一样。至少据我所知,目前不可能添加 engine = 'python'
之类的东西来旋转文档。
使用 reticulate::source_python
可能是一种解决方案。
例如,这是一个简单的 .R 脚本,它将被旋转为 .Rmd,然后呈现为 .html
自旋-me.R
#'---
#'title: R and Python in a spin file.
#'---
#'
#' This is an example of one way to write one R script, containing both R and
#' python, and can be spun to .Rmd via knitr::spin.
#'
#+ label = "setup"
library(nycflights13)
library(ggplot2)
library(reticulate)
use_condaenv()
#'
#' Create the file flights.csv to
#'
#+ label = "create_flights_csv"
write.csv(flights, file = "flights.csv")
#'
#' The file flights.py will read in the data from the flights.csv file. It can
#' be evaluated in this script via source_python(). This sould add a data.frame
#' called `py_flights` to the workspace.
source_python(file = "flights.py")
#'
#' And now, plot the results.
#'
#+ label = "plot"
ggplot(py_flights) + aes(carrier, arr_delay) + geom_point() + geom_jitter()
# /* spin and knit this file to html
knitr::spin(hair = "spin-me.R", knit = FALSE)
rmarkdown::render("spin-me.Rmd")
# */
python 文件是
flights.py
import pandas
py_flights = pandas.read_csv("flights.csv")
py_flights = py_flights[py_flights['dest'] == "ORD"]
py_flights = py_flights[['carrier', 'dep_delay', 'arr_delay']]
py_flights = py_flights.dropna()
结果 .html 的屏幕截图是:
EDIT 如果必须将所有内容保存在一个文件中,那么在调用 source_python
之前,您可以创建一个 python 文件,例如,
pycode <-
'import pandas
py_flights = pandas.read_csv("flights.csv")
py_flights = py_flights[py_flights["dest"] == "ORD"]
py_flights = py_flights[["carrier", "dep_delay", "arr_delay"]]
py_flights = py_flights.dropna()
'
cat(pycode, file = "temp.py")
source_python(file = "temp.py")
我的意见:将 python 代码放在自己的文件中比在 R 脚本中创建它更好,原因有两个:
- 更容易重用 python 代码
- 我的 IDE 中的语法高亮显示在 python 代码中丢失,当写成一个字符串而不在它自己的文件中时。
随着 reticulate 的出现,将 R 和 Python 结合在一个 .Rmd 文档中在 R 社区(包括我自己)中变得越来越流行。现在,我的个人工作流程通常从 R 脚本开始,在某些时候,我使用 knitr::spin()
创建一个可共享的报告,并将纯 .R 文档作为输入以避免代码重复(另请参见 Knitr's best hidden gem: spin有关该主题的更多信息)。
但是,一旦 Python 代码参与到我的分析中,我目前就被迫中断此工作流程并在编译之前手动将我的初始 .R 脚本转换(即复制和粘贴)为 .Rmd那个报告。我想知道,有没有人知道是否有可能——或者就此而言,是否有可能——让 knitr::spin()
在单个 .R 文件中同时使用 R 和 Python 代码块而不走这条弯路?我的意思是,就像在 .Rmd 文件中混合两种语言并在它们之间交换对象时一样。至少据我所知,目前不可能添加 engine = 'python'
之类的东西来旋转文档。
使用 reticulate::source_python
可能是一种解决方案。
例如,这是一个简单的 .R 脚本,它将被旋转为 .Rmd,然后呈现为 .html
自旋-me.R
#'---
#'title: R and Python in a spin file.
#'---
#'
#' This is an example of one way to write one R script, containing both R and
#' python, and can be spun to .Rmd via knitr::spin.
#'
#+ label = "setup"
library(nycflights13)
library(ggplot2)
library(reticulate)
use_condaenv()
#'
#' Create the file flights.csv to
#'
#+ label = "create_flights_csv"
write.csv(flights, file = "flights.csv")
#'
#' The file flights.py will read in the data from the flights.csv file. It can
#' be evaluated in this script via source_python(). This sould add a data.frame
#' called `py_flights` to the workspace.
source_python(file = "flights.py")
#'
#' And now, plot the results.
#'
#+ label = "plot"
ggplot(py_flights) + aes(carrier, arr_delay) + geom_point() + geom_jitter()
# /* spin and knit this file to html
knitr::spin(hair = "spin-me.R", knit = FALSE)
rmarkdown::render("spin-me.Rmd")
# */
python 文件是
flights.py
import pandas
py_flights = pandas.read_csv("flights.csv")
py_flights = py_flights[py_flights['dest'] == "ORD"]
py_flights = py_flights[['carrier', 'dep_delay', 'arr_delay']]
py_flights = py_flights.dropna()
结果 .html 的屏幕截图是:
EDIT 如果必须将所有内容保存在一个文件中,那么在调用 source_python
之前,您可以创建一个 python 文件,例如,
pycode <-
'import pandas
py_flights = pandas.read_csv("flights.csv")
py_flights = py_flights[py_flights["dest"] == "ORD"]
py_flights = py_flights[["carrier", "dep_delay", "arr_delay"]]
py_flights = py_flights.dropna()
'
cat(pycode, file = "temp.py")
source_python(file = "temp.py")
我的意见:将 python 代码放在自己的文件中比在 R 脚本中创建它更好,原因有两个:
- 更容易重用 python 代码
- 我的 IDE 中的语法高亮显示在 python 代码中丢失,当写成一个字符串而不在它自己的文件中时。