我正在尝试动态创建并循环使用htmlwidgets
,如DT
、plotly
或rbokeh
,以生成自动编织器报告。有没有一种方法可以将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()
)
)
```