RMarkdown:Python代码块上的knitr:purl()吗?

时间:2019-02-20 22:42:19

标签: python r r-markdown

我想将RMarkdown中的Python代码块导出到外部文件。 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 :(得分:1)

当前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我发现此问题正在寻找相同问题的解决方案。由于没有人回答,我开发了自己的解决方案:)