Generate Dynamic R Markdown Blocks

前端 未结 2 1215
既然无缘
既然无缘 2020-11-29 20:04

In my dataset, I have 60 groups that I want to analyze in put into an HTML report using R Markdown. Because I want to apply the same analysis to each group, I am hoping tha

相关标签:
2条回答
  • 2020-11-29 20:18

    Try knit_expand():

    Automate Chunks of Analysis in R Markdown 
    ========================================================
    
    ```{r setup, echo=FALSE}
    library(knitr)
    ```
    
    ```{r run-numeric-md, include=FALSE}
    out = NULL
    for (i in as.character(unique(iris$Species))) {
      out = c(out, knit_expand(text='#### Species = {{i}}'))
    }
    ```
    
    `r paste(knit(text = out), collapse = '\n')`
    

    You can also create a template file like 'child.rmd' and put this in your for loop so you don't have to put a complicated analysis in quotes:

    out = c(out, knit_expand('template.rmd'))
    

    Then have your 'template.rmd' be:

    #### Species = {{i}}
    
    0 讨论(0)
  • 2020-11-29 20:34

    Taking @sam's solution, I made the following generic function. Say you have a data frame called grfDf with DiagrammeR graph objects in the column graph. The following is all you need to plot all the graphs in Rmd : r require(DiagrammeR); renderHtmlWidgetList(grfDf$graph, render_graph). See the code for caveats.

    ```
    require(knitr)
    
    #' Render a list of htmlWidgets using various tricks
    #'
    #' @param widgetList A list of htmlWidget objects to be rendered
    #' @param renderFunction The function to render individual widgets. It can be either a name
    #'   of the rendering function, e.g., "render_graph" in DiagrammeR, or the actual function to
    #'   be passed to this call.
    #' @return The knitted string. This is to be included in the output by using `r renderHtmlWidgetList(...)`;
    #' @details This is a collection of various tricks. See the URL citations in the code.
    #'   Note that this code does alliterate global variables starting with "renderHtmlWidgetList_".
    #'   You may want to delete them using rm(list = ls(pattern="renderHtmlWidgetList_*")).
    #' @examples Inlcude the following in the Rmd directly
    #'   `r require(DiagrammeR); renderHtmlWidgetList(grfDf$graph, render_graph)`
    #'
    #' @export
    
    renderHtmlWidgetList <- function(widgetList, renderFunction){
      # error checking
      stopifnot(is.list(widgetList))
      # handles if the renderFunction is actually a function
      # http://stackoverflow.com/questions/10520772/in-r-how-to-get-an-objects-name-after-it-is-sent-to-a-function
      if(is.function(renderFunction)) {
        # convert back to string, because we need to knit it later
        renderFunction <- deparse(substitute(renderFunction))
      }
      stopifnot(is.character(renderFunction) & length(renderFunction)==1)
      stopifnot(exists(renderFunction, mode = "function"))
      # inject global vars; make sure we have a unique global var name
      gVarName<- paste0("renderHtmlWidgetList_", sample(1:10000, 1))
      while (exists(gVarName)) {
        gVarName<- paste0("renderHtmlWidgetList_", sample(1:10000, 1))
      }
      # assigning widgetList to a global temp var
      # http://stackoverflow.com/questions/5510966/create-a-variable-name-with-paste-in-r
      assign(gVarName, widgetList, envir = .GlobalEnv)
      # solution from https://gist.github.com/ReportMort/9ccb544a337fd1778179
      out <- NULL
      knitPrefix <- "\n```{r results='asis', cache=FALSE, echo=FALSE}\n\n"
      knitSuffix <- "\n\n```"
      for (i in 1:length(widgetList)) {
        knit_expanded <- paste0(knitPrefix, renderFunction, "(", gVarName, "[[", i, "]])")
        out = c(out, knit_expanded)
      }
      #invisible(out)
      paste(knitr::knit(text = out), collapse = '\n')
    }
    ```
    
    0 讨论(0)
提交回复
热议问题