---
title: "Animint meets shiny-based interactive documents"
author: "Carson Sievert"
date: "June 23, 2014"
runtime: shiny
---

[Animint](https://github.com/tdhock/animint) is an R package for creating web-based interactive graphics and animations using ggplot2’s grammar of graphics approach. Now you can embed animint plots inside [shiny apps](http://shiny.rstudio.com/). In the shiny app below, you can change the x/y/color variables and both plots will update.

```{r embedded}
library(shiny)
shinyAppDir(
  system.file("examples/shiny", package = "animint"),
  options = list(width = "100%", height = 500)
)
```

In addition to [embedding a shiny application inline](http://rmarkdown.rstudio.com/authoring_embedded_shiny.html), we can also `renderAnimint` directly inside of an [interactive document](http://rmarkdown.rstudio.com/authoring_shiny.html). To demonstrate, we use the world bank data [made famous by Hans Rosling](http://www.youtube.com/watch?v=hVimVzgtD6w). 

```{r worldBank, message=FALSE}
library(animint)
data(WorldBank, package = "animint")
```

```{r clean, echo=FALSE}
WorldBank$region <- gsub("(all income levels)", "", WorldBank$region, fixed = TRUE)
```

Now, we construct a time-series and scatterplot using ggplot2's grammar with the addition of animint's `clickSelects` and `showSelected` aesthetics to create an interactive link between the plots.

```{r plots}
ts <- ggplot() +
      make_tallrect(WorldBank, "year") +
      # plot the lines *on top of rectangles* so lines are clickable
      geom_line(aes(year, life.expectancy, group = country, colour = region,
                     clickSelects = country),
                 data = WorldBank, size = 4, alpha = 3/5) +
      guides(color = "none")

not.na <- subset(WorldBank, !(is.na(life.expectancy) | is.na(fertility.rate)))
scatter <- ggplot() +
       geom_point(aes(fertility.rate, life.expectancy, clickSelects = country,
                      showSelected = year, colour = region, size = population,
                      key = country), # key aesthetic for animated transitions!
                  data = not.na) +
       geom_text(aes(fertility.rate, life.expectancy, label = country,
                     showSelected = country, showSelected2 = year,
                     key = country), #also use key here!
                 data = not.na) +
       scale_size_animint(breaks = 10^(5:9)) +
       make_text(WorldBank, 5, 85, "year")
```

```{r sizing, echo=FALSE}
# just to make sure everything fits in one line
ts <- ts + theme_animint(width = 360, height = 360)
scatter <- scatter + theme_animint(width = 360, height = 360)
```

In this example, the plot aesthetics are fixed, but we could integrate shiny's reactive components into animint's options such as the animation speed. 

```{r reactives}
getPlotList <- reactive({
  # think of animint objects as a list of ggplots and specially named options
  list(# the plots we constructed earlier
       ts = ts,
       scatter = scatter,
       time = list(variable = "year", ms = input$time),
       duration = list(year = input$duration),
       first = list(year = 1975, country = c("United States", "Vietnam")),
       selector.types = list(country = "multiple"))
})

inputPanel(
  sliderInput("time", "Display time for each frame (in milliseconds)", 
              min = 10, max = 10000, value = 3000, step = 10),
  sliderInput("duration", "Time between frames (in milliseconds)", 
              min = 10, max = 5000, value = 1000, step = 10)
)

renderAnimint({
  getPlotList()
})
```



```{r sessionInfo}
sessionInfo()
```