#' @title Batch processing for plots into figures for many columns
#'
#' @description epi_plot_en_masse() takes a data.frame and column type,
#' creates multi-plot figures for all and saves to disk.
#' Useful when plotting tens to hundreds of plots.
#' By default runs in parallel.
#'
#' @param df Dataframe with variables to plot.
#'
#' @param file_prefix Prefix to use for filenames. Default is ''.
#'
#' @param plot_type Plot type to generate, this is passed to cowplot::save_plot.
#' Default is 'svg'.
#'
# @param vars_list List of variables names to plot.
#
#' @param var_type Type of variables to plot, numeric, integer or factor.
#' Default is 'numeric'.
#'
#' @param plot_step Number of plots per page (file). Default is 6.
#'
#' @param ... Arguments to pass to epi_utils_multicore().
#'
#' @return Nothing, saves plots to disk.
#'
#' @note epi_utils_multicore() will run with defaults (max cores - 1 and multiprocess).
#' You may need to experiment first to see how many plots fit per page.
#'
#' @author Antonio Berlanga-Taylor <\url{https://github.com/AntonioJBT/episcout}>
#'
#' @seealso \code{\link{epi_plot_list}},
#' \code{\link{epi_plots_to_grid}},
#' \code{\link{epi_plot_cow_save}},
#' \code{\link{epi_utils_multicore}}.
#'
#' @examples
#' \dontrun{
#'
#' # Adjust labels and generate plots:
#' lab <- stringr::str_replace_all(string = i, pattern = "_", replacement = " ")
#' lab <- stringr::str_to_upper(lab)
#' }
# @export
#'
# @importFrom foreach `%dopar%`
# @importFrom magrittr `%>%`
# TO DO: test and complete
# decide how to pass plotting function
epi_plot_en_masse <- function(df = NULL,
file_prefix = "",
plot_type = "svg",
var_type = "numeric",
plot_step = 6,
...) {
if (!requireNamespace("dplyr", quietly = TRUE)) {
stop("Package dplyr needed for this function to work. Please install it.",
call. = FALSE
)
}
if (!requireNamespace("foreach", quietly = TRUE)) {
stop("Package foreach needed for this function to work. Please install it.",
call. = FALSE
)
}
if (!requireNamespace("future", quietly = TRUE)) {
stop("Package future needed for this function to work. Please install it.",
call. = FALSE
)
}
# Set-up types of variable to plot:
if (var_type == "numeric") {
var_type <- expression(is.numeric(.))
} else if (var_type == "integer") {
var_type <- expression(is.integer(.))
} else if (var_type == "factor") {
var_type <- expression(is.factor(.))
}
print("Collecting variables to plot...")
# var_type
vars_list <- df %>%
dplyr::select_if(~ eval(var_type)) %>%
names()
print("First few variables:")
print(head(vars_list))
# Create list:
plot_list <- epi_plot_list(vars_list)
# length(hist_list)
# Set-up type of plot to use:
#
# Set-up multi-core:
epi_utils_multicore(...)
# TO DO: pass user function
print("Plotting...")
plot_list <- foreach::foreach(i = vars_list, .verbose = TRUE) %dopar% {
# for (i in vars_list) {
# TO DO: insert user call for arbitrary plot:
plot_list[[i]] <- epi_plot_hist(df, i) #+ ggplot2::xlab(label = lab)
}
print("Done plotting.")
# Check one:
names(plot_list)
plot_list[1]
# Save to file in multiple pages:
plot_step <- plot_step
# Set-up multi-core:
epi_utils_multicore(...)
print("Saving plots...")
save_plots <- foreach::foreach(
i = seq(1, length(vars_list),
by = plot_step
),
.verbose = TRUE
) %dopar% {
# for (i in seq(1, length(vars_list), by = plot_step)) {
page_start <- i
page_stop <- i + plot_step - 1
page_name <- paste0("plot_", i)
plot_grid <- epi_plots_to_grid(plot_list = plot_list[page_start:page_stop])
file_name <- epi_output_name(
file_prefix,
sprintf("_%s.%s", page_name, plot_type)
)
epi_plot_cow_save(
plot_grid = plot_grid,
file_name = file_name
)
}
# End:
print("Done plotting and saving.")
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.