RMarkdown: knitr: purl () на фрагмент кода Python? - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу экспортировать свой фрагмент кода Python в RMarkdown во внешний файл.knitr: purl () достигает этого, но я могу заставить его работать только на кусках кода R.Разве это не работает для любого другого языка, кроме R?

Например, снизу экспортируйте код python в файл my_script.py.

---
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}
x = 10
y = 20

z = x + y
print(z)
```

1 Ответ

0 голосов
/ 17 июня 2019

В настоящее время 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 Я нашел этот вопросв поисках решения той же проблемы.Поскольку никто не ответил, я разработал собственное решение:)

...