## ----setup, include=FALSE, warning=FALSE--------------------------------------
knitr::opts_chunk$set(echo = TRUE, 
                      warning = FALSE,
                      message = FALSE,
                      fig.align = "center", 
                      fig.width = 6, 
                      fig.height = 5,
                      out.width = "80%", 
                      collapse = TRUE,
                      comment = "#>",
                      tidy.opts = list(width.cutoff = 65),
                      tidy = FALSE)
library(knitr)
library(magrittr)
library(loon.tourr, quietly = TRUE)
library(tidyverse, quietly = TRUE)
library(MASS)
set.seed(12314159)
imageDirectory <- "./images/tours"
dataDirectory <- "./data/tours"
path_concat <- function(path1, ..., sep="/") {
  # The "/" is standard unix directory separator and so will
  # work on Macs and Linux.
  # In windows the separator might have to be sep = "\" or 
  # even sep = "\\" or possibly something else. 
  paste(path1, ..., sep = sep)
}

## ----library loon.tourr, warning=FALSE, message=FALSE, error=FALSE------------
library(loon.tourr)

## ----data, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
library(MASS, quietly = TRUE)
kable(head(crabs, 6))

## ----crabs 2D, eval = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
#  color <- rep("skyblue", nrow(crabs))
#  color[crabs$sp == "O"] <- "orange"
#  cr <- crabs[, c("FL", "RW", "CL", "CW", "BD")]
#  p0 <- l_tour(cr, color = color)

## ----crabs 2D gif, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "GIF 1: 2D grand tour"----
include_graphics(path_concat(imageDirectory, "crab2D.gif"))

## ----crabs 4D, eval = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
#  p1 <- l_tour(cr,
#               tour_path = grand_tour(4L),
#               color = color)

## ----crabs 4D gif, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "GIF 2: 4D grand tour"----
include_graphics(path_concat(imageDirectory, "crab4D.gif"))

## ----`l_tour` class, eval = FALSE-----------------------------------------------
#  class(p1) # class(p0)
#  # > [1] "l_tour" "loon"

## ----`l_tour` getLoon, eval = FALSE---------------------------------------------
#  w <- l_getPlots(p1)
#  class(w)
#  # > [1] "l_serialaxes" "loon"

## ----query matrix of projection vectors, eval = FALSE-------------------------
#  round(p1["projection"], 2)
#  # >
#  #       [,1]  [,2]  [,3]  [,4]
#  # [1,] -0.12 -0.93 -0.01 -0.35
#  # [2,] -0.57  0.21  0.63 -0.36
#  # [3,] -0.06  0.14  0.14 -0.38
#  # [4,] -0.37  0.23 -0.76 -0.47
#  # [5,] -0.72 -0.14 -0.12  0.62

## ----parallel, eval = FALSE---------------------------------------------------
#  p1["axesLayout"] <- "parallel"

## ----andrews, eval = FALSE----------------------------------------------------
#  p1["andrews"] <- TRUE

## ----static grid, eval = FALSE------------------------------------------------
#  plot(p1)

## ----static ggplot, eval = FALSE----------------------------------------------
#  loon.ggplot::loon.ggplot(p1)

## ----crabs andrews, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "Figure 1: Andrews curve"----
include_graphics(path_concat(imageDirectory, "andrews.png"))

## ----gt, eval = FALSE---------------------------------------------------------
#  # Default, 2D grand tour
#  pg <- l_tour(cr, tour_path = grand_tour(2L))

## ----holes, eval = FALSE------------------------------------------------------
#  # 2D holes projection pursuit indexes
#  pp_holes <- l_tour(cr, tour_path = guided_tour(holes(), 2L))

## ----cmass, eval = FALSE------------------------------------------------------
#  # 2D CM projection pursuit indexes
#  pp_CM <- l_tour(cr, tour_path = guided_tour(cmass(), 2L))

## ----PCA, eval = FALSE--------------------------------------------------------
#  # 2D LDA projection pursuit indexes
#  pp_LDA <- l_tour(cr,
#                   color = crabs$sex,
#                   tour_path = guided_tour(lda_pp(crabs$sex), 2L))

## ----crabs facets, eval = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
#  pf <- l_tour(cr,
#               by = crabs$sex,
#               color = color)

## ----crabs facets gif, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "GIF 3: facets"----
include_graphics(path_concat(imageDirectory, "facets.gif"))

## ----crabs pairs, eval = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
#  pp <- l_tour_pairs(cr,
#                     tour_path = grand_tour(4L),
#                     color = color,
#                     showSerialAxes = TRUE)

## ----crabs pairs gif, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "GIF 4: pairs plot"----
include_graphics(path_concat(imageDirectory, "pairs.gif"))

## ----`l_tour_compound` class, eval = FALSE--------------------------------------
#  class(pp) # or class(pf)
#  # > [1] "l_tour_compound" "loon"

## ----pairs objects, eval = FALSE----------------------------------------------
#  wp <- l_getPlots(pp)
#  wp
#  # >
#  # $x2y1
#  # [1] ".l0.pairs.plot"
#  # attr(,"class")
#  # [1] "l_plot" "loon"
#  #
#  # $x3y1
#  # [1] ".l0.pairs.plot1"
#  # attr(,"class")
#  # [1] "l_plot" "loon"
#  #
#  # $x4y1
#  # [1] ".l0.pairs.plot2"
#  # attr(,"class")
#  # [1] "l_plot" "loon"
#  #
#  # $x3y2
#  # [1] ".l0.pairs.plot3"
#  # attr(,"class")
#  # [1] "l_plot" "loon"
#  #
#  # $x4y2
#  # [1] ".l0.pairs.plot4"
#  # attr(,"class")
#  # [1] "l_plot" "loon"
#  #
#  # $x4y3
#  # [1] ".l0.pairs.plot5"
#  # attr(,"class")
#  # [1] "l_plot" "loon"
#  #
#  # $serialAxes
#  # [1] ".l0.pairs.serialaxes"
#  # attr(,"class")
#  # [1] "l_serialaxes" "loon"
#  #
#  # attr(,"class")
#  # [1] "l_pairs"    "l_compound" "loon"

## ----crabs hull, eval = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
#  # pack layer on top of `p0`
#  l0 <- l_layer_hull(p0, group = crabs$sp)

## ----hull gif, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "GIF 5: layer hull"----
include_graphics(path_concat(imageDirectory, "hull.gif"))

## ----crabs density2D, eval = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
#  # hide the hull
#  l_layer_hide(l0)
#  # density2D
#  l1 <- l_layer_density2d(p0)

## ----density 2D gif, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "GIF 5: layer density"----
include_graphics(path_concat(imageDirectory, "density2D.gif"))

## ----crabs trails, eval = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
#  # hide the density2D
#  l_layer_hide(l1)
#  # density2D
#  l2 <- l_layer_trails(p0)

## ----crabs trails gif, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "GIF 5: layer density"----
include_graphics(path_concat(imageDirectory, "trails.gif"))

## ----non-interactive layer, eval = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
#  allx <- unlist(pf['x'])
#  ally <- unlist(pf['y'])
#  layers <- lapply(l_getPlots(pf),
#                   function(p) {
#                     l <- loon::l_layer_points(p,
#                                               x = allx,
#                                               y = ally,
#                                               color = "grey80",
#                                               label = "background")
#                     # set the layer as the background
#                     loon::l_layer_lower(p, l)
#                   })

## ----non-interactive layer gif, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "Figure 2: non-interactive layer"----
include_graphics(path_concat(imageDirectory, "tour_layer_non_interactive.PNG"))

## ----interactive layer, eval = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center"----
#  l_layer_callback.background <- function(target, layer, ...) {
#  
#    widget <- l_getPlots(target)
#    layer <- loon::l_create_handle(c(widget, layer))
#  
#    args <- list(...)
#    # the overall tour paths
#    allTours <- args$allTours
#    # the scale bar variable
#    var <- args$var
#    # the current projection (bind both facets)
#    proj <- do.call(rbind, allTours[[var]])
#  
#    loon::l_configure(layer,
#                      x = proj[, 1],
#                      y = proj[, 2])
#  }

## ----interactive layer gif, echo = FALSE, warning=FALSE, message=FALSE, error=FALSE, fig.width=4, fig.height=3, fig.align="center", fig.cap = "GIF 7: interactive layer"----
include_graphics(path_concat(imageDirectory, "tour_layer_interactive.gif"))

