r-动态循环使用htmlwidgets,并为RMarkdown添加编织器格式



我正在尝试动态创建并循环使用htmlwidgets,如DTplotlyrbokeh,以生成自动编织器报告。有没有一种方法可以将knitr格式(如tabset)添加到本github问题中概述的tagList方法中https://github.com/ramnathv/htmlwidgets/pull/110?我也在那里发布了这个问题。

下面是我所想的一些示例代码,但它并不完全起作用。我想做的是创建10个选项卡,每个选项卡都有一个plot_list生成的绘图副本。现在发生的情况是,所有的绘图都进入最后一个选项卡。实际上,plot_list会有不同的绘图/表格。

#' ---
#' title: htmltools::tagList test
#' output:
#'    html_document
#' ---
#' # {.tabset}
#+ results='asis', echo=FALSE
library(plotly)
library(printr)
plot_list = lapply(1:10, 
                   function(i){ 
                     as.widget(plot_ly(iris, 
                                       x = iris[["Sepal.Length"]],
                                       y = iris[["Sepal.Width"]], 
                                       mode = "markers")) 
                    } 
                  )
htmltools::tagList( lapply(1:10, 
                            function(i) {
                              pandoc.header(paste0("Tab",i,' {.tabset}'), 2)
                              plot_list[[i]]
                            } 
                          )
                   )
# rmarkdown::render("your_path/htmltoolsTagList_test.r")

以前,我曾成功地用嵌套的for循环做过类似的事情,但一旦我尝试使用具有HTML依赖关系的图形,图形当然不会呈现,因为它们不再是顶级表达式。在knitr中有可能这样循环吗?

我的一个后续问题是:假设我想将这些选项卡嵌套到以相同方式创建的另一组选项卡中,这可能吗?我想问的是,我可以使用类似于嵌套for循环的方法动态嵌套选项卡吗?

我仍在学习如何使用knitr,如果有任何帮助,我将不胜感激!非常感谢。

我将在下面复制我对Github问题的响应。

这个问题很好,我认为其他人会从这次讨论中得到帮助。在没有rmarkdown帮助的情况下,从头开始构建类似于您所建议的内容可能是最容易的。

手动生成

# https://github.com/ramnathv/htmlwidgets/pull/110#issuecomment-216562703
library(plotly)
library(htmltools)
library(markdown)
library(shiny)
browsable(
  attachDependencies(
    tagList(
      tags$div(
        class="tabs",
        tags$ul(
          class="nav nav-tabs",
          role="tablist",
          tags$li(
            tags$a(
              "data-toggle"="tab",
              href="#tab-1",
              "Iris"
            )
          ),
          tags$li(
            tags$a(
              "data-toggle"="tab",
              href="#tab-2",
              "Cars"
            )
          )
        ),
        tags$div(
          class="tab-content",
          tags$div(
            class="tab-pane active",
            id="tab-1",
            as.widget(
              plot_ly(
                iris,
                x = iris[["Sepal.Length"]],
                y = iris[["Sepal.Width"]], 
                mode = "markers"
              )
            )
          ),
          tags$div(
            class="tab-pane",
            id="tab-2",
            as.widget(
              plot_ly(
                cars,
                x = speed,
                y = dist, 
                mode = "markers"
              )
            )
          )
        )
      )
    ),
    # attach dependencies
    #  see https://github.com/rstudio/rmarkdown/blob/master/R/html_document.R#L235
    list(
      rmarkdown::html_dependency_jquery(),
      shiny::bootstrapLib()
    )
  )
)

在rmarkdown

可能有更好的方法来实现这一点,但在有人澄清之前,我们可以采用上面的方法,并在rmarkdown中使用它。不幸的是,这仍然是非常手动的。为了获得更多参考,以下是RStudio用于构建tabsets的代码。

---
title: "tabs and htmlwidgets"
author: "Kent Russell"
date: "May 3, 2016"
output: html_document
---
```{r echo=FALSE, message=FALSE, warning=FALSE}
library(plotly)
library(htmltools)
library(magrittr)
# make a named list of plots for demonstration
#  the names will be the titles for the tabs
plots <- list(
  "iris" = plot_ly(
    iris,
    x = iris[["Sepal.Length"]],
    y = iris[["Sepal.Width"]], 
    mode = "markers"
  ),
  "cars" = plot_ly(
    cars,
    x = speed,
    y = dist, 
    mode = "markers"
  )
)
# create our top-level div for our tabs
tags$div(
  # create the tabs with titles as a ul with li/a
  tags$ul(
    class="nav nav-tabs",
    role="tablist",
    lapply(
      names(plots),
      function(p){
        tags$li(
          tags$a(
            "data-toggle"="tab",
            href=paste0("#tab-",p),
            p
          )
        )
      }
    )
  ),
  # fill the tabs with our plotly plots
  tags$div(
    class="tab-content",
    lapply(
      names(plots),
      function(p){
         tags$div(
          #  make the first tabpane active
          class=ifelse(p==names(plots)[1],"tab-pane active","tab-pane"),
          #  id will need to match the id provided to the a href above
          id=paste0("tab-",p),
          as.widget(plots[[p]])
        )
      }
    )
  )
) %>%
  # attach the necessary dependencies
  #  since we are manually doing what rmarkdown magically does for us
  attachDependencies(
    list(
      rmarkdown::html_dependency_jquery(),
      shiny::bootstrapLib()
    )
  )
```

相关内容

  • 没有找到相关文章

最新更新