кусок кода, как l oop с knit_expand отображает результаты asis с заголовками? - PullRequest
0 голосов
/ 17 июня 2020

Я читал похожие вопросы ( здесь , здесь и здесь , а также здесь ), но не смог получить эту работу, возможно, из-за сочетания гробов и растровых гробов в списке в l oop. По сути, у меня есть вложенный l oop для печати объектов в списке, и мне нужны заголовки для объектов, использующих markdown. Я использую подход knit_expand с дочерними шаблонами. Если я устанавливаю results = 'asis', заголовки работают, а графики - нет, а если я удаляю results = 'asis', графики работают, но не заголовки. Какие-нибудь решения? Вот воспроизводимый пример, который близок к тому, что я делаю, хотя подсписки здесь придуманы и работают не совсем правильно, но идея та же (сочетание заголовков, которые должны быть объектами asis и plot):

Главный шаблон (Master.Rmd)

    ---
    title: "Example"
    output:
      html_document:
        toc: true
        toc_float: true
        toc_depth: 2
    ---
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = FALSE)
    library(knitr)
    library(datasets)
    library(ggplot2)
    library(data.table)
    library(png)
    library(grid)
    library(gridExtra)
    library(RCurl)
    data(iris)
    plotsList = vector(mode = "list", length = length(levels(iris$Species)))
    names(plotsList) = levels(iris$Species)
    irisDT = as.data.table(iris)
    dataInList = split(irisDT, by="Species")
    for(i in seq(plotsList)){
      plotsList[[i]]$example_plot[1] <- list(ggplot(data=dataInList[[i]], aes(x = Sepal.Length, y = Sepal.Width)) +
                                              geom_point() + xlab("Sepal Length") + ylab("Sepal Width") +
                                              ggtitle(paste0("Sepal Length-Width for ", names(plotsList[i]))))
      plotsList[[i]]$example_plot[2] <- list(ggplot(data=dataInList[[i]], aes(x = Petal.Length, y = Petal.Width)) +
                                              geom_point() + xlab("Petal Length") + ylab("Petal Width") +
                                              ggtitle(paste0("Petal Length-Width for ", names(plotsList[i]))))
      plotsList[[i]]$png_example <- rasterGrob(readPNG(getURLContent(("https://i.imgur.com/mfuTUPD.png"))))
    }
    ```

    # Big Heading 

    some text

    ## Other headings

    other text

    # Loop output Description {.tabset .tabset-fade}

    text about loop output

    ```{r run_loop, echo=FALSE}
    # for the headings to work, results need to be asis, but then the plots don't work :(
    out = NULL
    out2 = NULL
    for(i in seq(plotsList)){
      cat("\n")
      cat("## ", {{names(plotsList[i])}}, "\n")
      out = c(out, knit_expand('one_level.Rmd'))
      for(j in seq(plotsList[[i]][['example_plot']])){
        out2 = c(out2, knit_expand('two_level.Rmd'))
      }
    }
    ```

    `r paste(knit(text = out), collapse = '\n')`
    `r paste(knit(text = out2), collapse = '\n')`
    ```

и дочерний шаблон (Child.Rmd):

    ```{r echo=FALSE}
      grid.arrange(plotsList[[i]][['example_plot']][[j]])
    ```

    ```{r echo=FALSE, results='asis'}
      grid.arrange(plotsList[[i]][['png_example']])
    ```

1 Ответ

0 голосов
/ 20 июня 2020

Я уверен, что есть другие способы сделать это, но в конце концов я понял, как добавить разметку заголовков непосредственно в вывод knit expand из master.Rmd, например:

  `out = c(out, knit_expand(text = paste0("\n## ", {{names(combined.plots[i])}},  "\n  ")))`
...