117 lines
3.8 KiB
R
117 lines
3.8 KiB
R
|
|
#' Create a box with a sparkline
|
|
#'
|
|
#' @param data A \code{data.frame}-like object with at least two columns,
|
|
#' first is mapped to x-axis, second to y-axis.
|
|
#' @param title Title to display in the box.
|
|
#' @param subtitle Subtitle to display in the box.
|
|
#' @param color Color of the chart.
|
|
#' @param background Background color of the box.
|
|
#' @param type Type of chart, currently type supported are :
|
|
#' \code{"area"} (default), \code{"line"}, \code{"spline"}, \code{"column"}.
|
|
#' @param synchronize Give a common id to charts to synchronize them (tooltip and zoom).
|
|
#' @param title_style,subtitle_style A \code{list} of named attributes to style
|
|
#' the title / subtitle, possible values are \code{fontSize},
|
|
#' \code{fontWeight}, \code{fontFamily}, \code{color}.
|
|
#' @param width,height A numeric input in pixels.
|
|
#' @param elementId Use an explicit element ID for the widget.
|
|
#'
|
|
#' @return An \code{apexcharts} \code{htmlwidget} object.
|
|
#' @export
|
|
#'
|
|
#' @note In Shiny use \code{sparkBoxOutput} / \code{renderSparkBox} to render boxes, see example.
|
|
#' Boxes have CSS class \code{"apexcharter-spark-box"} if you need more styling.
|
|
#'
|
|
#' @importFrom htmlwidgets sizingPolicy
|
|
#' @importFrom rlang sym
|
|
#' @importFrom ggplot2 aes
|
|
#'
|
|
#' @example examples/spark_box.R
|
|
spark_box <- function(data,
|
|
title = NULL,
|
|
subtitle = NULL,
|
|
color = "#2E93fA",
|
|
background = "#FFF",
|
|
type = c("area", "line", "spline", "column"),
|
|
synchronize = NULL,
|
|
title_style = NULL,
|
|
subtitle_style = NULL,
|
|
width = NULL,
|
|
height = NULL,
|
|
elementId = NULL) {
|
|
type <- match.arg(type)
|
|
data <- as.data.frame(data)
|
|
if (ncol(data) < 2)
|
|
stop("'data' must have at least two columns!", call. = FALSE)
|
|
x_var <- names(data)[1]
|
|
y_var <- names(data)[2]
|
|
spark <- apex(
|
|
data = data,
|
|
aes(x = !!sym(x_var), y = !!sym(y_var)),
|
|
type = type,
|
|
auto_update = config_update(update_options = TRUE)
|
|
)
|
|
spark <- ax_chart(
|
|
ax = spark,
|
|
sparkline = list(enabled = TRUE),
|
|
group = synchronize
|
|
)
|
|
spark <- ax_yaxis(spark, show = FALSE)
|
|
spark <- ax_colors(spark, color)
|
|
if (!is.null(title)) {
|
|
if (is.null(title_style))
|
|
title_style <- list(fontSize = "24px")
|
|
if (is.null(title_style$fontSize))
|
|
title_style$fontSize <- "24px"
|
|
spark <- ax_title(
|
|
ax = spark,
|
|
text = title,
|
|
style = title_style
|
|
)
|
|
}
|
|
if (!is.null(subtitle)) {
|
|
if (is.null(subtitle_style))
|
|
subtitle_style <- list(fontSize = "14px")
|
|
if (is.null(subtitle_style$fontSize))
|
|
subtitle_style$fontSize <- "14px"
|
|
spark <- ax_subtitle(
|
|
ax = spark,
|
|
text = subtitle,
|
|
style = subtitle_style
|
|
)
|
|
}
|
|
spark$x$sparkbox <- list(
|
|
color = color, background = background
|
|
)
|
|
spark$sizingPolicy <- htmlwidgets::sizingPolicy(
|
|
defaultWidth = "100%",
|
|
defaultHeight = "160px",
|
|
viewer.defaultHeight = "160px",
|
|
viewer.defaultWidth = "100%",
|
|
viewer.fill = FALSE,
|
|
knitr.figure = FALSE,
|
|
knitr.defaultWidth = "100%",
|
|
knitr.defaultHeight = "160px",
|
|
browser.fill = FALSE,
|
|
viewer.suppress = FALSE,
|
|
browser.external = TRUE,
|
|
padding = 15
|
|
)
|
|
return(spark)
|
|
}
|
|
|
|
|
|
#' @rdname apexcharter-shiny
|
|
#' @export
|
|
sparkBoxOutput <- function(outputId, width = "100%", height = "160px") { # nocov start
|
|
htmlwidgets::shinyWidgetOutput(outputId, "apexcharter", width, height, package = "apexcharter")
|
|
} # nocov end
|
|
|
|
#' @rdname apexcharter-shiny
|
|
#' @export
|
|
renderSparkBox <- function(expr, env = parent.frame(), quoted = FALSE) { # nocov start
|
|
if (!quoted) { expr <- substitute(expr) } # force quoted
|
|
htmlwidgets::shinyRenderWidget(expr, apexchartOutput, env, quoted = TRUE)
|
|
} # nocov end
|
|
|