В настоящее время purl
выводит код без R закомментированный.Поэтому нам нужно переопределить функцию вывода, чтобы переопределить это.
Вот простой скрипт, который (1) выводит только код Python и (2) разбирает документацию (я взял функцию из источника knitr и взломал ее):
library("knitr")
# New processing functions
process_tangle <- function (x) {
UseMethod("process_tangle", x)
}
process_tangle.block <- function (x) {
params = opts_chunk$merge(x$params)
# Suppress any code but python
if (params$engine != 'python') {
params$purl <- FALSE
}
if (isFALSE(params$purl))
return("")
label = params$label
ev = params$eval
code = if (!isFALSE(ev) && !is.null(params$child)) {
cmds = lapply(sc_split(params$child), knit_child)
one_string(unlist(cmds))
}
else knit_code$get(label)
if (!isFALSE(ev) && length(code) && any(grepl("read_chunk\\(.+\\)",
code))) {
eval(parse_only(unlist(stringr::str_extract_all(code,
"read_chunk\\(([^)]+)\\)"))))
}
code = knitr:::parse_chunk(code)
if (isFALSE(ev))
code = knitr:::comment_out(code, params$comment, newline = FALSE)
# Output only the code, no documentation
return(knitr:::one_string(code))
}
# Reassign functions
assignInNamespace("process_tangle.block",
process_tangle.block,
ns="knitr")
# Purl
purl("tmp.Rmd", output="tmp.py")
Вот мой tmp.Rmd
файл.Обратите внимание, что у него есть блок R, который мне не нужен в результате:
---
title: "Untitled"
output: html_document
---
## Header
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip
```{python}
#!/usr/bin/env python
# A python script
```
```{python}
x = 10
y = 20
z = x + y
print(z)
```
```{r}
y=5
y
```
Запуск Rscript extract.R
Я получаю tmp.py
:
#!/usr/bin/env python
# A python script
x = 10
y = 20
z = x + y
print(z)
PS Я нашел этот вопросв поисках решения той же проблемы.Поскольку никто не ответил, я разработал собственное решение:)