【问题标题】:Retrieve and execute example code from an R package function as a codeblock in R-markdown从 R 包函数中检索并执行示例代码作为 R-markdown 中的代码块
【发布时间】:2018-08-29 05:36:27
【问题描述】:

我想从R 包中提取示例代码并自动在rmarkdown 文件中运行它。

我可以使用函数utils::example 提取代码,如下所示。

example("geom_histogram", package = "ggplot2", ask = F,
         prompt.prefix = "", give.lines = TRUE)[-(1:5)]

我尝试如下使用块选项results="asis",但结果是以代码输出而不是代码块的形式给出的。

```{r,echo = FALSE, results="asis"}
cat("```{r}")
library(ggplot2)
cat(paste(example("geom_histogram", package = "ggplot2", ask = F,
                  prompt.prefix = "", give.lines = TRUE)[-(1:5)], collapse = "\n"))
cat("```")
```

我希望将代码作为代码块,输出与http://ggplot2.tidyverse.org/reference/geom_histogram.html 中的相同。如何做到这一点?

【问题讨论】:

    标签: r knitr r-markdown


    【解决方案1】:

    更新答案:

    您可以创建一个函数来提取代码并将其用作块选项中的code 参数。

    # Function saved in functions.R file
    getCode <- function(myFunction, myPackage) {
        example(myFunction, myPackage, ask = FALSE, character.only = TRUE,
                prompt.prefix = "", give.lines = TRUE)[-(1:5)]
    }
    

    您的Rmd (myFile.Rmd) 应如下所示:

    ```{r, meta, include = FALSE}
    myPackage  <- "ggplot2"
    myFunction <- "geom_histogram"
    source("functions.R")
    ```
    
    ```{r, intro, echo = FALSE, results = "asis"}
    cat("#", myPackage, "\n")
    cat("##", myFunction, "\n")
    library(myPackage, character.only = TRUE)
    ```
    
    ```{r, runCode, code = getCode(myFunction, myPackage)}
    ```
    

    knitr::knit2html("myFile.Rmd") 编织Rmd 以获得这样的结果:


    上一个答案:

    将提取的代码写入一个虚拟文件 (foo.R),并将其用作块选项中的 code 参数。

    示例文件 (myFile.Rmd):

    • 第一个块:加载测试库
    • 第二个块:提取示例并将其保存到文件中
    • 第三块:运行提取的代码
    ```{r, meta, include = FALSE}
    library(ggplot2)
    ```
    
    ```{r, getCode, include = FALSE}
    code <- example("geom_histogram", package = "ggplot2", ask = FALSE,
                    prompt.prefix = "", give.lines = TRUE)[-(1:5)]
    write.table(code, "foo.R", quote = FALSE, row.names = FALSE, col.names = FALSE)
    ```
    
    ```{r, runCode, code = readLines("foo.R")}
    ```
    

    使用knitr::knit2html("myFile.Rmd") 编织文件以获得如下结果:

    我们还可以移除硬编码的变量以获得更灵活的输出:

    ```{r, meta, include = FALSE}
    myPackage  <- "ggplot2"
    myFunction <- "geom_histogram"
    library(myPackage, character.only = TRUE)
    ```
    
    ```{r, getCode, include = FALSE}
    code <- example(myFunction, myPackage, ask = FALSE, character.only = TRUE,
                    prompt.prefix = "", give.lines = TRUE)[-(1:5)]
    write.table(code, "foo.R", quote = FALSE, row.names = FALSE, col.names = FALSE)
    ```
    
    ```{r, intro, echo = FALSE, results = "asis"}
    cat("#", myPackage, "\n")
    cat("##", myFunction, "\n")
    ```
    
    ```{r, runCode, code = readLines("foo.R")}
    ```
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 2018-01-03
      • 2016-02-02
      相关资源
      最近更新 更多