Как построить график солнечных лучей в цикле в документе RMarkdown? - PullRequest
0 голосов
/ 20 мая 2019

Моя цель - создать отчет по разметке HTML R, в котором я хотел бы включить несколько графиков солнечных лучей, по одному на интересующую меня сущность.Солнечные вспышки нарисованы с использованием sunburstR библиотеки .Каждый график должен находиться на соответствующей вкладке.

Проблема в том, что я понятия не имею, как на самом деле отобразить график на вкладке.Я пытался присвоить график переменной и print ing или plot ting, но безрезультатно.Я также попытался пропустить назначение и что-то сделать с вызовом объекта, также безуспешно.Поскольку объект sunburstR также является htmlwidget, я также посмотрел руководство по этому пакету, но даже там я не смог найти руку помощи.Кажется, проблема в том, что я делаю это в цикле, и для достижения своей цели мне нужно запустить код в ячейке, помеченной как results='asis', что затрудняет отображение графика.

Проблема ниженемного упрощенно, но отлично показывает, с чем я борюсь (например, модифицированная версия: https://github.com/timelyportfolio/sunburstR/blob/master/inst/examples/example_calendar.R). Самодостаточный фрагмент кода уценки для воспроизведения проблемы (обратите внимание, что все ниже - файл R Markdown)(Расширение .Rmd), и он должен быть запущен так):


---
title: "Markdown with sunburst graphs - example"
author: "User"
date: "`r paste('Date: ', Sys.Date())`"
output: html_document
---

```{r load-packages, include=FALSE}
library(sunburstR)
library(dplyr)
library(knitr)
```

```{r data-preparation}
df <- data.frame(
  date = seq.Date(
    as.Date('2014-01-01'),
    as.Date('2016-12-31'),
    by = "days"
  ),
  stringsAsFactors = FALSE
)

df$year = format(df$date, "%Y")
df$quarter = paste0("Q", ceiling(as.numeric(format(df$date,"%m"))/3))
df$month = format(df$date, "%b")
df$count = rep(1, nrow(df))
```

# Graphs per year {.tabset .tabset-fade #results}

```{r plot-per-year, results='asis'}
for(year_ in unique(df$year)){
  cat(paste0("## ", year_, "\n\n"))
  df_year <- df %>% filter(year == year_) %>% mutate(path=paste(quarter, month, sep="-"))
  print(kable(head(df_year, 5), format="markdown"))
  sunburst(data.frame(xtabs(count~path,df_year))) # what to do here to display the graph?
}
```

Я также включил kable объект для справки, так как он действительно виденв документе, открытом в браузере (граф Санберст отсутствует). Есть ли у вас какие-либо предложения о том, как заставить его работать?

1 Ответ

0 голосов
/ 22 мая 2019

Этот код немного грязный и не оптимизирован, но должен обеспечить решение.Как правило, решение для создания htmlwidgets в цикле - это tagList(lapply(... create htmlwidget... ), как описано в DT issue .Однако, поскольку мы пытаемся обернуть каждую диаграмму во вкладки, решение становится беспорядочным.Нам нужно будет вручную создавать вкладки, а затем отдельно создавать диаграммы как содержимое вкладок.

---
title: "Markdown with sunburst graphs - example"
author: "User"
date: "`r paste('Date: ', Sys.Date())`"
output: 
  html_document: 
    keep_md: yes
    self_contained: no
---

```{r load-packages, include=FALSE}
library(sunburstR)
library(dplyr)
library(knitr)
library(htmltools)
```

```{r data-preparation}
df <- data.frame(
  date = seq.Date(
    as.Date('2014-01-01'),
    as.Date('2016-12-31'),
    by = "days"
  ),
  stringsAsFactors = FALSE
)

df$year = format(df$date, "%Y")
df$quarter = paste0("Q", ceiling(as.numeric(format(df$date,"%m"))/3))
df$month = format(df$date, "%b")
df$count = rep(1, nrow(df))
```

# Graphs per year

```{r tabs-per-year, results='asis', warning=FALSE, echo=FALSE}
htmltools::tags$ul(
  class = "nav nav-pills",
  role = "tablist",
  lapply(unique(df$year), function(year_) {
    if(year_ == unique(df$year)[1]) {
      class = "active"
    } else {
      class = ""
    }
    htmltools::tags$li(
      role = "presentation",
      class = class,
      htmltools::tags$a(
        role="tab",
        "data-toggle" = "tab",
        href = paste0("#", "year-", year_),
        year_
      )
    )
  })
)
```

```{r charts-per-year, results='asis', warning=FALSE, echo=FALSE}
htmltools::tags$div(
  class = "tab-content",
  lapply(unique(df$year), function(year_) {
    if(year_ == unique(df$year[1])) {
      class = "active in"
    } else {
      class = ""
    }
    df_year <- df %>% filter(year == year_) %>% mutate(path=paste(quarter, month, sep="-"))
    htmltools::tags$div(
      id = paste0("year-", year_),
      role = "tabpanel",
      class = paste0("tab-pane tabbed-pane fade ", class),
      sunburst(data.frame(xtabs(count~path,df_year))) # what to do here to display the graph?
    )
  })
)  
```
...