通过 rmarkdown 中的 highcharter 循环打印单个图表

问题描述 投票:0回答:1

我想使用 rmarkdown 和 highcharter 包打印在 for 循环中创建的单个图表作为选项卡式内容。

到目前为止,我只成功在一个选项卡中显示所有图形。

问题似乎是已知的(for循环中的离线图)。但是,我没有设法将建议的解决方案应用到我的代码中。

这是一个最小的例子:

---
title: "test"
output: html_document
---

```{r setup, include=FALSE}
#libraries
library(tidyverse)
library(highcharter)
library(htmltools)

#data
mydata <- data.frame(year  = c("2018", "2018", "2019", "2020"),
                 license = c("CC BY", "CC BY-NC", "CC BY", "CC BY"),
                 cost = c(1000, 1500, 2000, 1000))

#functions
group_by_license <- function(x) {
  x %>%
    group_by(license) %>%
    summarise(cost = sum(cost))
}
```

### license {.tabset .tabset-fade}

```{r mydata-license, results='asis', echo=F}
#data transformation
mydata_year <- split(mydata, mydata$year)

mydata_license <- lapply(mydata_year, group_by_license)

#chart
mychart <- function(i) {
  hchart(mydata_license[[i]],"pie", hcaes(x = license, y = cost)) %>%
    hc_title(text = paste0("My Data ", i))
}

#loop
a <- tagList()

for(i in unique(mydata$year)) {
  cat("#### ", i, "\n \n")
  a[[i]] <- mychart(i)
}

a
```

所有三个创建的图表都显示在最后一个选项卡中,而前两个选项卡为空:

plots generated in the last tab

empty first tab

我想在相应的选项卡中显示每个图(2018 年的图形在 2018 年选项卡等中)。

我还尝试了

print
,但没有成功,要么没有显示结果,要么没有显示图表的 HTML 代码,但没有图形:请参阅此处尝试的解决方案

r r-markdown r-highcharter htmltools
1个回答
0
投票

你是对的。问题和解决方案似乎与其他帖子中的相同,请参见例如我对 ggplotly

DT
 从 Rmarkdown 中的 
for
 循环中的回答,但这是我第一次将其应用于 
highcharter
:

要将图表放在单独的选项卡中,您必须在
    for
  1. 循环内打印图表。在您的代码中,您在块的末尾输出所有图表,因此它们都放在最后一个选项卡中。
  2. for
  3. 循环内使用
    print(htmltools::tagList( mychart(i) )
    打印图表
    最后,为了完成这项工作,我们需要另一个步骤来确保所有必需的 JS 依赖项都添加到您的 Rmd 中,这可以通过调用 
  4. highchart()
  5. 来实现。我已将其放在一个单独的块中,并为其设置了
    include=FALSE
    
    
---
title: "test"
output: html_document
---

```{r setup, include=FALSE}
#libraries
library(tidyverse)
library(highcharter)
library(htmltools)

#data
mydata <- data.frame(year  = c("2018", "2018", "2019", "2020"),
                 license = c("CC BY", "CC BY-NC", "CC BY", "CC BY"),
                 cost = c(1000, 1500, 2000, 1000))

#functions
group_by_license <- function(x) {
  x %>%
    group_by(license) %>%
    summarise(cost = sum(cost))
}
```

```{r include=FALSE}
# Init Step to make sure that the dependencies are loaded
highchart()
```

### license {.tabset .tabset-fade}

```{r mydata-license, results='asis', echo=F}
mydata_year <- split(mydata, mydata$year)

mydata_license <- lapply(mydata_year, group_by_license)

mychart <- function(i) {
  hchart(mydata_license[[i]],"pie", hcaes(x = license, y = cost)) %>%
    hc_title(text = paste0("My Data ", i))
}

for(i in unique(mydata$year)) {
  cat("#### ", i, "\n \n")
  print(
    htmltools::tagList( mychart(i) )
  )
}
```

© www.soinside.com 2019 - 2024. All rights reserved.