|
- #' Animates the gather function
- #'
- #' @param w a data_frame in the wide format
- #' @param key the key
- #' @param value the value
- #' @param ... further arguments passed to [tidyr::gather()], [process_wide()],
- #' or [process_long()]
- #' @param detailed boolean value if the animation should show one step for each
- #' key value
- #' @inheritParams animate_join
- #' @inheritParams anim_options
- #'
- #' @return a gif or a ggplot
- #' @export
- #'
- #' @examples
- #' wide <- data_frame(
- #' year = 2010:2011,
- #' Alice = c(105, 110),
- #' Bob = c(100, 97),
- #' Charlie = c(90, 95)
- #' )
- #' animate_gather(wide, "person", "sales", -year, export = "first")
- #' animate_gather(wide, "person", "sales", -year, export = "last")
- #'
- #' \donttest{
- #' animate_gather(wide, "person", "sales", -year, export = "gif")
- #' # if you want to have a less detailed animation, you can also use
- #' animate_gather(wide, "person", "sales", -year, export = "gif", detailed = FALSE)
- #' }
- animate_gather <- function(w, key, value, ..., export = "gif", detailed = TRUE, anim_opts = anim_options()) {
- anim_opts <- default_anim_opts("gather", anim_opts)
- lhs <- w
- rhs <- tidyr::gather(w, !!key, !!value, ...)
-
- # construct the title sequence
- wname <- deparse(substitute(w))
- tidyr_selection <- get_quos_names(...)
- ids <- setdiff(colnames(w), tidyselect::vars_select(colnames(w), ...))
-
- id_string <- paste0(", ", paste(sprintf("%s", tidyr_selection), collapse = ", "))
-
- sequence <- c(
- current_state = "wide",
- final_state = "long",
- operation = sprintf("gather(%s, %s, %s%s)",
- wname,
- dput_parser(key),
- dput_parser(value),
- id_string),
- reverse_operation = sprintf("spread(%s, %s, %s)",
- "long",
- dput_parser(key),
- dput_parser(value))
- )
-
- key_values <- rhs %>% pull(key) %>% unique()
- lhs_proc <- process_wide(lhs, ids, key, key_values, value, ...)
- rhs_proc <- process_long(rhs, ids, key, value, ...)
-
- gather_spread(lhs_proc, rhs_proc, sequence = sequence, key_values = key_values,
- export = export, detailed = detailed, ..., anim_opts = anim_opts)
- }
-
-
- #' Animates the spread function
- #'
- #' @param l a data_frame in the long/tidy format
- #' @param ... further arguments passed to [process_long] or [process_wide]
- #' @inheritParams animate_gather
- #' @inheritParams animate_join
- #' @inheritParams anim_options
- #'
- #' @return a ggplot or a gif
- #' @export
- #'
- #' @examples
- #' long <- data_frame(
- #' year = c(2010L, 2011L, 2010L, 2011L, 2010L, 2011L),
- #' person = c("Alice", "Alice", "Bob", "Bob", "Charlie", "Charlie"),
- #' sales = c(105, 110, 100, 97, 90, 95)
- #' )
- #' animate_spread(long, key = "person", value = "sales", export = "first")
- #' animate_spread(long, key = "person", value = "sales", export = "last")
- #'
- #' \donttest{
- #' animate_spread(long, key = "person", value = "sales", export = "gif")
- #' # if you want to have a less detailed animation, you can also use
- #' animate_spread(long, key = "person", value = "sales", export = "gif", detailed = FALSE)
- #' }
- animate_spread <- function(l, key, value, export = "gif", detailed = TRUE, ..., anim_opts = anim_options()) {
- anim_opts <- default_anim_opts("spread", anim_opts)
-
- lhs <- l
- rhs <- tidyr::spread(l, key = key, value = value)
-
- # construct the title sequence
- lname <- deparse(substitute(l))
- ids <- names(lhs)
- ids <- ids[!ids %in% c(key, value)]
-
- id_string <- paste0(", ", paste(sprintf("-%s", ids), collapse = ", "))
-
- sequence <- c(
- current_state = "long",
- final_state = "wide",
- operation = sprintf("spread(%s, %s, %s)",
- lname,
- dput_parser(key),
- dput_parser(value)),
- reverse_operation = sprintf("gather(%s, %s, %s%s)",
- "wide",
- dput_parser(key),
- dput_parser(value),
- id_string)
- )
-
- lhs_proc <- process_long(lhs, ids, key, value, ...)
- rhs_proc <- process_wide(rhs, ids, key, value, ...)
-
- key_values <- lhs %>% pull(key) %>% unique()
- gather_spread(lhs_proc, rhs_proc, sequence, key_values, export, detailed, ..., anim_opts = anim_opts)
- }
|