mirror of
https://github.com/rstudio/shiny.git
synced 2026-04-29 03:00:45 -04:00
Merge branch 'interactive-graphic'
Conflicts: inst/www/shared/shiny.min.js inst/www/shared/shiny.min.js.map Re-minified the shiny.min.js file in the merge.
This commit is contained in:
362
R/bootstrap.R
362
R/bootstrap.R
@@ -1695,90 +1695,326 @@ verbatimTextOutput <- function(outputId) {
|
||||
textOutput(outputId, container = pre)
|
||||
}
|
||||
|
||||
#' Create a image output element
|
||||
#' Create an plot or image output element
|
||||
#'
|
||||
#' Render a \link{renderImage} within an application page.
|
||||
#' @param outputId output variable to read the image from
|
||||
#' @param width Image width. Must be a valid CSS unit (like \code{"100\%"},
|
||||
#' \code{"400px"}, \code{"auto"}) or a number, which will be coerced to a
|
||||
#' string and have \code{"px"} appended.
|
||||
#' @param height Image height
|
||||
#' @inheritParams textOutput
|
||||
#' @return An image output element that can be included in a panel
|
||||
#' @examples
|
||||
#' # Show an image
|
||||
#' mainPanel(
|
||||
#' imageOutput("dataImage")
|
||||
#' )
|
||||
#' @export
|
||||
imageOutput <- function(outputId, width = "100%", height="400px", inline=FALSE) {
|
||||
style <- paste("width:", validateCssUnit(width), ";",
|
||||
"height:", validateCssUnit(height))
|
||||
container <- if (inline) span else div
|
||||
container(id = outputId, class = "shiny-image-output", style = style)
|
||||
}
|
||||
|
||||
#' Create an plot output element
|
||||
#' Render a \code{\link{renderPlot}} or \code{\link{renderImage}} within an
|
||||
#' application page.
|
||||
#'
|
||||
#' Render a \link{renderPlot} within an application page.
|
||||
#' @param outputId output variable to read the plot from
|
||||
#' @param width,height Plot width/height. Must be a valid CSS unit (like
|
||||
#' @section Interactive plots:
|
||||
#'
|
||||
#' Plots and images in Shiny support mouse-based interaction, via clicking,
|
||||
#' double-clicking, hovering, and brushing. When these interaction events
|
||||
#' occur, the mouse coordinates will be sent to the server as \code{input$}
|
||||
#' variables, as specified by \code{click}, \code{dblclick}, \code{hover}, or
|
||||
#' \code{brush}.
|
||||
#'
|
||||
#' For \code{plotOutput}, the coordinates will be sent scaled to the data
|
||||
#' space, if possible. (At the moment, plots generated by base graphics
|
||||
#' support this scaling, although plots generated by grid or ggplot2 do not.)
|
||||
#' If scaling is not possible, the raw pixel coordinates will be sent. For
|
||||
#' \code{imageOutput}, the coordinates will be sent in raw pixel coordinates.
|
||||
#'
|
||||
#' @param outputId output variable to read the plot/image from.
|
||||
#' @param width,height Image width/height. Must be a valid CSS unit (like
|
||||
#' \code{"100\%"}, \code{"400px"}, \code{"auto"}) or a number, which will be
|
||||
#' coerced to a string and have \code{"px"} appended. These two arguments are
|
||||
#' ignored when \code{inline = TRUE}, in which case the width/height of a plot
|
||||
#' must be specified in \code{renderPlot()}. Note that, for height, using
|
||||
#' \code{"auto"} or \code{"100\%"} generally will not work as expected, because
|
||||
#' of how height is computed with HTML/CSS.
|
||||
#' @param clickId If not \code{NULL}, the plot will send coordinates to the
|
||||
#' server whenever it is clicked. This information will be accessible on the
|
||||
#' \code{input} object using \code{input$}\emph{\code{clickId}}. The value
|
||||
#' will be a named list or vector with \code{x} and \code{y} elements
|
||||
#' indicating the mouse position in user units.
|
||||
#' @param hoverId If not \code{NULL}, the plot will send coordinates to the
|
||||
#' server whenever the mouse pauses on the plot for more than the number of
|
||||
#' milliseconds determined by \code{hoverTimeout}. This information will be
|
||||
#' accessible on the \code{input} object using
|
||||
#' \code{input$}\emph{\code{clickId}}. The value will be \code{NULL} if the
|
||||
#' user is not hovering, and a named list or vector with \code{x} and \code{y}
|
||||
#' elements indicating the mouse position in user units.
|
||||
#' @param hoverDelay The delay for hovering, in milliseconds.
|
||||
#' @param hoverDelayType The type of algorithm for limiting the number of hover
|
||||
#' events. Use \code{"throttle"} to limit the number of hover events to one
|
||||
#' every \code{hoverDelay} milliseconds. Use \code{"debounce"} to suspend
|
||||
#' events while the cursor is moving, and wait until the cursor has been at
|
||||
#' rest for \code{hoverDelay} milliseconds before sending an event.
|
||||
#' \code{"auto"} or \code{"100\%"} generally will not work as expected,
|
||||
#' because of how height is computed with HTML/CSS.
|
||||
#' @param click This can be \code{NULL} (the default), a string, or an object
|
||||
#' created by the \code{\link{clickOpts}} function. If you use a value like
|
||||
#' \code{"plot_click"} (or equivalently, \code{clickOpts(id="plot_click")}),
|
||||
#' the plot will send coordinates to the server whenever it is clicked, and
|
||||
#' the value will be accessible via \code{input$plot_click}. The value will
|
||||
#' be a named list with \code{x} and \code{y} elements indicating the mouse
|
||||
#' position.
|
||||
#' @param dblclick This is just like the \code{click} argument, but for
|
||||
#' double-click events.
|
||||
#' @param hover Similar to the \code{click} argument, this can be \code{NULL}
|
||||
#' (the default), a string, or an object created by the
|
||||
#' \code{\link{hoverOpts}} function. If you use a value like
|
||||
#' \code{"plot_hover"} (or equivalently, \code{hoverOpts(id="plot_hover")}),
|
||||
#' the plot will send coordinates to the server pauses on the plot, and the
|
||||
#' value will be accessible via \code{input$plot_hover}. The value will be a
|
||||
#' named list with \code{x} and \code{y} elements indicating the mouse
|
||||
#' position. To control the hover time or hover delay type, you must use
|
||||
#' \code{\link{hoverOpts}}.
|
||||
#' @param clickId Deprecated; use \code{click} instead. Also see the
|
||||
#' \code{\link{clickOpts}} function.
|
||||
#' @param hoverId Deprecated; use \code{hover} instead. Also see the
|
||||
#' \code{\link{hoverOpts}} function.
|
||||
#' @param hoverDelay Deprecated; use \code{hover} instead. Also see the
|
||||
#' \code{\link{hoverOpts}} function.
|
||||
#' @param hoverDelayType Deprecated; use \code{hover} instead. Also see the
|
||||
#' \code{\link{hoverOpts}} function.
|
||||
#' @param brush Similar to the \code{click} argument, this can be \code{NULL}
|
||||
#' (the default), a string, or an object created by the
|
||||
#' \code{\link{brushOpts}} function. If you use a value like
|
||||
#' \code{"plot_brush"} (or equivalently, \code{brushOpts(id="plot_brush")}),
|
||||
#' the plot will allow the user to "brush" in the plotting area, and will send
|
||||
#' information about the brushed area to the server, and the value will be
|
||||
#' accessible via \code{input$plot_brush}. Brushing means that the user will
|
||||
#' be able to draw a rectangle in the plotting area and drag it around. The
|
||||
#' value will be a named list with \code{xmin}, \code{xmax}, \code{ymin}, and
|
||||
#' \code{ymax} elements indicating the brush area. To control the brush
|
||||
#' behavior, use \code{\link{brushOpts}}.
|
||||
#' @inheritParams textOutput
|
||||
#' @note The arguments \code{clickId} and \code{hoverId} only work for R base
|
||||
#' graphics (see the \pkg{\link{graphics}} package). They do not work for
|
||||
#' \pkg{\link[grid:grid-package]{grid}}-based graphics, such as \pkg{ggplot2},
|
||||
#' \pkg{lattice}, and so on.
|
||||
#' @return A plot output element that can be included in a panel
|
||||
#'
|
||||
#' @return A plot or image output element that can be included in a panel.
|
||||
#' @seealso For the corresponding server-side functions, see
|
||||
#' \code{\link{renderPlot}} and \code{\link{renderImage}}.
|
||||
#'
|
||||
#' @examples
|
||||
#' # Show a plot of the generated distribution
|
||||
#' mainPanel(
|
||||
#' plotOutput("distPlot")
|
||||
#' # Only run these examples in interactive R sessions
|
||||
#' if (interactive()) {
|
||||
#'
|
||||
#' # A basic shiny app with a plotOutput
|
||||
#' shinyApp(
|
||||
#' ui = fluidPage(
|
||||
#' sidebarLayout(
|
||||
#' sidebarPanel(
|
||||
#' actionButton("newplot", "New plot")
|
||||
#' ),
|
||||
#' mainPanel(
|
||||
#' plotOutput("plot")
|
||||
#' )
|
||||
#' )
|
||||
#' ),
|
||||
#' server = function(input, output) {
|
||||
#' output$plot <- renderPlot({
|
||||
#' input$newplot
|
||||
#' # Add a little noise to the cars data
|
||||
#' cars2 <- cars + rnorm(nrow(cars))
|
||||
#' plot(cars2)
|
||||
#' })
|
||||
#' }
|
||||
#' )
|
||||
#'
|
||||
#'
|
||||
#' # A demonstration of clicking, hovering, and brushing
|
||||
#' shinyApp(
|
||||
#' ui = basicPage(
|
||||
#' fluidRow(
|
||||
#' column(width = 4,
|
||||
#' plotOutput("plot", height=300,
|
||||
#' click = "plot_click", # Equiv, to click=clickOpts(id="plot_click")
|
||||
#' hover = hoverOpts(id = "plot_hover", delayType = "throttle"),
|
||||
#' brush = brushOpts(id = "plot_brush", fill = "red")
|
||||
#' )
|
||||
#' ),
|
||||
#' column(width = 3,
|
||||
#' verbatimTextOutput("plot_clickinfo"),
|
||||
#' verbatimTextOutput("plot_hoverinfo")
|
||||
#' ),
|
||||
#' column(width = 3,
|
||||
#' wellPanel(actionButton("newplot", "New plot")),
|
||||
#' verbatimTextOutput("plot_brushinfo")
|
||||
#' )
|
||||
#' )
|
||||
#' ),
|
||||
#' server = function(input, output, session) {
|
||||
#' output$plot <- renderPlot({
|
||||
#' input$newplot
|
||||
#' # Add a little noise to the cars data
|
||||
#' cars2 <- cars + rnorm(nrow(cars))
|
||||
#' plot(cars2)
|
||||
#' })
|
||||
#' output$plot_clickinfo <- renderPrint({
|
||||
#' cat("Click:\n")
|
||||
#' str(input$plot_click)
|
||||
#' })
|
||||
#' output$plot_hoverinfo <- renderPrint({
|
||||
#' cat("Hover (throttled):\n")
|
||||
#' str(input$plot_hover)
|
||||
#' })
|
||||
#' output$plot_brushinfo <- renderPrint({
|
||||
#' cat("Brush (debounced):\n")
|
||||
#' str(input$plot_brush)
|
||||
#' })
|
||||
#' }
|
||||
#' )
|
||||
#'
|
||||
#'
|
||||
#' # Demo of clicking, hovering, brushing with imageOutput
|
||||
#' # Note that coordinates are in pixels
|
||||
#' shinyApp(
|
||||
#' ui = basicPage(
|
||||
#' fluidRow(
|
||||
#' column(width = 4,
|
||||
#' imageOutput("image", height=300,
|
||||
#' click = "image_click",
|
||||
#' hover = hoverOpts(
|
||||
#' id = "image_hover",
|
||||
#' delay = 500,
|
||||
#' delayType = "throttle"
|
||||
#' ),
|
||||
#' brush = brushOpts(id = "image_brush", fill = "red")
|
||||
#' )
|
||||
#' ),
|
||||
#' column(width = 3,
|
||||
#' verbatimTextOutput("image_clickinfo"),
|
||||
#' verbatimTextOutput("image_hoverinfo")
|
||||
#' ),
|
||||
#' column(width = 3,
|
||||
#' wellPanel(actionButton("newimage", "New image")),
|
||||
#' verbatimTextOutput("image_brushinfo")
|
||||
#' )
|
||||
#' )
|
||||
#' ),
|
||||
#' server = function(input, output, session) {
|
||||
#' output$image <- renderImage({
|
||||
#' input$newimage
|
||||
#'
|
||||
#' # Get width and height of image output
|
||||
#' width <- session$clientData$output_image_width
|
||||
#' height <- session$clientData$output_image_height
|
||||
#'
|
||||
#' # Write to a temporary PNG file
|
||||
#' outfile <- tempfile(fileext = ".png")
|
||||
#'
|
||||
#' png(outfile, width=width, height=height)
|
||||
#' plot(rnorm(200), rnorm(200))
|
||||
#' dev.off()
|
||||
#'
|
||||
#' # Return a list containing information about the image
|
||||
#' list(
|
||||
#' src = outfile,
|
||||
#' contentType = "image/png",
|
||||
#' width = width,
|
||||
#' height = height,
|
||||
#' alt = "This is alternate text"
|
||||
#' )
|
||||
#' })
|
||||
#' output$image_clickinfo <- renderPrint({
|
||||
#' cat("Click:\n")
|
||||
#' str(input$image_click)
|
||||
#' })
|
||||
#' output$image_hoverinfo <- renderPrint({
|
||||
#' cat("Hover (throttled):\n")
|
||||
#' str(input$image_hover)
|
||||
#' })
|
||||
#' output$image_brushinfo <- renderPrint({
|
||||
#' cat("Brush (debounced):\n")
|
||||
#' str(input$image_brush)
|
||||
#' })
|
||||
#' }
|
||||
#' )
|
||||
#'
|
||||
#' }
|
||||
#' @export
|
||||
plotOutput <- function(outputId, width = "100%", height="400px",
|
||||
clickId = NULL, hoverId = NULL, hoverDelay = 300,
|
||||
hoverDelayType = c("debounce", "throttle"), inline = FALSE) {
|
||||
if (is.null(clickId) && is.null(hoverId)) {
|
||||
hoverDelay <- NULL
|
||||
hoverDelayType <- NULL
|
||||
} else {
|
||||
hoverDelayType <- match.arg(hoverDelayType)[[1]]
|
||||
imageOutput <- function(outputId, width = "100%", height="400px",
|
||||
click = NULL, dblclick = NULL,
|
||||
hover = NULL, hoverDelay = NULL, hoverDelayType = NULL,
|
||||
brush = NULL,
|
||||
clickId = NULL, hoverId = NULL,
|
||||
inline = FALSE) {
|
||||
|
||||
if (!is.null(clickId)) {
|
||||
shinyDeprecated(
|
||||
msg = paste("The 'clickId' argument is deprecated. ",
|
||||
"Please use 'click' instead. ",
|
||||
"See ?imageOutput or ?plotOutput for more information."),
|
||||
version = "0.11.1"
|
||||
)
|
||||
click <- clickId
|
||||
}
|
||||
|
||||
if (!is.null(hoverId)) {
|
||||
shinyDeprecated(
|
||||
msg = paste("The 'hoverId' argument is deprecated. ",
|
||||
"Please use 'hover' instead. ",
|
||||
"See ?imageOutput or ?plotOutput for more information."),
|
||||
version = "0.11.1"
|
||||
)
|
||||
hover <- hoverId
|
||||
}
|
||||
|
||||
if (!is.null(hoverDelay) || !is.null(hoverDelayType)) {
|
||||
shinyDeprecated(
|
||||
msg = paste("The 'hoverDelay'and 'hoverDelayType' arguments are deprecated. ",
|
||||
"Please use 'hoverOpts' instead. ",
|
||||
"See ?imageOutput or ?plotOutput for more information."),
|
||||
version = "0.11.1"
|
||||
)
|
||||
hover <- hoverOpts(id = hover, delay = hoverDelay, delayType = hoverDelayType)
|
||||
}
|
||||
|
||||
style <- if (!inline) {
|
||||
paste("width:", validateCssUnit(width), ";", "height:", validateCssUnit(height))
|
||||
}
|
||||
|
||||
|
||||
# Build up arguments for call to div() or span()
|
||||
args <- list(
|
||||
id = outputId,
|
||||
class = "shiny-image-output",
|
||||
style = style
|
||||
)
|
||||
|
||||
# Given a named list with options, replace names like "delayType" with
|
||||
# "data-hover-delay-type" (given a prefix "hover")
|
||||
formatOptNames <- function(opts, prefix) {
|
||||
newNames <- paste("data", prefix, names(opts), sep = "-")
|
||||
# Replace capital letters with "-" and lowercase letter
|
||||
newNames <- gsub("([A-Z])", "-\\L\\1", newNames, perl = TRUE)
|
||||
names(opts) <- newNames
|
||||
opts
|
||||
}
|
||||
|
||||
if (!is.null(click)) {
|
||||
# If click is a string, turn it into clickOpts object
|
||||
if (is.character(click)) {
|
||||
click <- clickOpts(id = click)
|
||||
}
|
||||
args <- c(args, formatOptNames(click, "click"))
|
||||
}
|
||||
|
||||
if (!is.null(dblclick)) {
|
||||
if (is.character(dblclick)) {
|
||||
dblclick <- clickOpts(id = dblclick)
|
||||
}
|
||||
args <- c(args, formatOptNames(dblclick, "dblclick"))
|
||||
}
|
||||
|
||||
if (!is.null(hover)) {
|
||||
if (is.character(hover)) {
|
||||
hover <- hoverOpts(id = hover)
|
||||
}
|
||||
args <- c(args, formatOptNames(hover, "hover"))
|
||||
}
|
||||
|
||||
if (!is.null(brush)) {
|
||||
if (is.character(brush)) {
|
||||
brush <- brushOpts(id = brush)
|
||||
}
|
||||
args <- c(args, formatOptNames(brush, "brush"))
|
||||
}
|
||||
|
||||
container <- if (inline) span else div
|
||||
container(id = outputId, class = "shiny-plot-output", style = style,
|
||||
`data-click-id` = clickId,
|
||||
`data-hover-id` = hoverId,
|
||||
`data-hover-delay` = hoverDelay,
|
||||
`data-hover-delay-type` = hoverDelayType)
|
||||
do.call(container, args)
|
||||
}
|
||||
|
||||
#' @rdname imageOutput
|
||||
#' @export
|
||||
plotOutput <- function(outputId, width = "100%", height="400px",
|
||||
click = NULL, dblclick = NULL,
|
||||
hover = NULL, hoverDelay = NULL, hoverDelayType = NULL,
|
||||
brush = NULL,
|
||||
clickId = NULL, hoverId = NULL,
|
||||
inline = FALSE) {
|
||||
|
||||
# Result is the same as imageOutput, except for HTML class
|
||||
res <- imageOutput(outputId, width, height, click, dblclick,
|
||||
hover, hoverDelay, hoverDelayType, brush,
|
||||
clickId, hoverId, inline)
|
||||
|
||||
res$attribs$class <- "shiny-plot-output"
|
||||
res
|
||||
}
|
||||
|
||||
#' Create a table output element
|
||||
|
||||
131
R/image-interact-opts.R
Normal file
131
R/image-interact-opts.R
Normal file
@@ -0,0 +1,131 @@
|
||||
#' Create an object representing click options
|
||||
#'
|
||||
#' This generates an object representing click options, to be passed as the
|
||||
#' \code{click} argument of \code{\link{imageOutput}} or
|
||||
#' \code{\link{plotOutput}}.
|
||||
#'
|
||||
#' @param id Input value name. For example, if the value is \code{"plot_click"},
|
||||
#' then the click coordinates will be available as \code{input$plot_click}.
|
||||
#' @param clip Should the click area be clipped to the plotting area? If FALSE,
|
||||
#' then the server will receive click events even when the mouse is outside
|
||||
#' the plotting area, as long as it is still inside the image.
|
||||
#' @export
|
||||
clickOpts <- function(id = NULL, clip = TRUE) {
|
||||
if (is.null(id))
|
||||
stop("id must not be NULL")
|
||||
|
||||
list(
|
||||
id = id,
|
||||
clip = clip
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
#' Create an object representing double-click options
|
||||
#'
|
||||
#' This generates an object representing dobule-click options, to be passed as
|
||||
#' the \code{dblclick} argument of \code{\link{imageOutput}} or
|
||||
#' \code{\link{plotOutput}}.
|
||||
#'
|
||||
#' @param id Input value name. For example, if the value is
|
||||
#' \code{"plot_dblclick"}, then the click coordinates will be available as
|
||||
#' \code{input$plot_dblclick}.
|
||||
#' @param clip Should the click area be clipped to the plotting area? If FALSE,
|
||||
#' then the server will receive double-click events even when the mouse is
|
||||
#' outside the plotting area, as long as it is still inside the image.
|
||||
#' @param delay Maximum delay (in ms) between a pair clicks for them to be
|
||||
#' counted as a double-click.
|
||||
#' @export
|
||||
dblclickOpts <- function(id = NULL, clip = TRUE, delay = 400) {
|
||||
if (is.null(id))
|
||||
stop("id must not be NULL")
|
||||
|
||||
list(
|
||||
id = id,
|
||||
clip = clip,
|
||||
delay = delay
|
||||
)
|
||||
}
|
||||
|
||||
#' Create an object representing hover options
|
||||
#'
|
||||
#' This generates an object representing hovering options, to be passed as the
|
||||
#' \code{hover} argument of \code{\link{imageOutput}} or
|
||||
#' \code{\link{plotOutput}}.
|
||||
#'
|
||||
#' @param id Input value name. For example, if the value is \code{"plot_hover"},
|
||||
#' then the hover coordinates will be available as \code{input$plot_hover}.
|
||||
#' @param delay How long to delay (in milliseconds) when debouncing or
|
||||
#' throttling, before sending the mouse location to the server.
|
||||
#' @param delayType The type of algorithm for limiting the number of hover
|
||||
#' events. Use \code{"throttle"} to limit the number of hover events to one
|
||||
#' every \code{delay} milliseconds. Use \code{"debounce"} to suspend events
|
||||
#' while the cursor is moving, and wait until the cursor has been at rest for
|
||||
#' \code{delay} milliseconds before sending an event.
|
||||
#' @param clip Should the hover area be clipped to the plotting area? If FALSE,
|
||||
#' then the server will receive hover events even when the mouse is outside
|
||||
#' the plotting area, as long as it is still inside the image.
|
||||
#' @export
|
||||
hoverOpts <- function(id = NULL, delay = 300,
|
||||
delayType = c("debounce", "throttle"), clip = TRUE) {
|
||||
if (is.null(id))
|
||||
stop("id must not be NULL")
|
||||
|
||||
list(
|
||||
id = id,
|
||||
delay = delay,
|
||||
delayType = match.arg(delayType),
|
||||
clip = clip
|
||||
)
|
||||
}
|
||||
|
||||
#' Create an object representing brushing options
|
||||
#'
|
||||
#' This generates an object representing brushing options, to be passed as the
|
||||
#' \code{brush} argument of \code{\link{imageOutput}} or
|
||||
#' \code{\link{plotOutput}}.
|
||||
#'
|
||||
#' @param id Input value name. For example, if the value is \code{"plot_brush"},
|
||||
#' then the coordinates will be available as \code{input$plot_brush}.
|
||||
#' @param fill Fill color of the brush.
|
||||
#' @param stroke Outline color of the brush.
|
||||
#' @param opacity Opacity of the brush
|
||||
#' @param delay How long to delay (in milliseconds) when debouncing or
|
||||
#' throttling, before sending the brush data to the server.
|
||||
#' @param delayType The type of algorithm for limiting the number of brush
|
||||
#' events. Use \code{"throttle"} to limit the number of brush events to one
|
||||
#' every \code{delay} milliseconds. Use \code{"debounce"} to suspend events
|
||||
#' while the cursor is moving, and wait until the cursor has been at rest for
|
||||
#' \code{delay} milliseconds before sending an event.
|
||||
#' @param clip Should the brush area be clipped to the plotting area? If FALSE,
|
||||
#' then the user will be able to brush outside the plotting area, as long as
|
||||
#' it is still inside the image.
|
||||
#' @param direction The direction for brushing. If \code{"xy"}, the brush can be
|
||||
#' drawn and moved in both x and y directions. If \code{"x"}, or \code{"y"},
|
||||
#' the brush wil work horizontally or vertically.
|
||||
#' @param resetOnNew When a new image is sent to the browser (via
|
||||
#' \code{\link{renderImage}}), should the brush be reset? The default,
|
||||
#' \code{FALSE}, is useful if you want to update the plot while keeping the
|
||||
#' brush. Using \code{TRUE} is useful if you want to clear the brush whenever
|
||||
#' the plot is updated.
|
||||
#' @export
|
||||
brushOpts <- function(id = NULL, fill = "#666", stroke = "#000",
|
||||
opacity = 0.3, delay = 300,
|
||||
delayType = c("debounce", "throttle"), clip = TRUE,
|
||||
direction = c("xy", "x", "y"),
|
||||
resetOnNew = FALSE) {
|
||||
if (is.null(id))
|
||||
stop("id must not be NULL")
|
||||
|
||||
list(
|
||||
id = id,
|
||||
fill = fill,
|
||||
stroke = stroke,
|
||||
opacity = opacity,
|
||||
delay = delay,
|
||||
delayType = match.arg(delayType),
|
||||
clip = clip,
|
||||
direction = match.arg(direction),
|
||||
resetOnNew = resetOnNew
|
||||
)
|
||||
}
|
||||
@@ -46,8 +46,9 @@ as.tags.shiny.render.function <- function(x, ..., inline = FALSE) {
|
||||
#' The corresponding HTML output tag should be \code{div} or \code{img} and have
|
||||
#' the CSS class name \code{shiny-plot-output}.
|
||||
#'
|
||||
#' @seealso For more details on how the plots are generated, and how to control
|
||||
#' the output, see \code{\link{plotPNG}}.
|
||||
#' @seealso For the corresponding client-side output function, and example
|
||||
#' usage, see \code{\link{plotOutput}}. For more details on how the plots are
|
||||
#' generated, and how to control the output, see \code{\link{plotPNG}}.
|
||||
#'
|
||||
#' @param expr An expression that generates a plot.
|
||||
#' @param width,height The width/height of the rendered plot, in pixels; or
|
||||
@@ -140,20 +141,20 @@ renderPlot <- function(expr, width='auto', height='auto', res=72, ...,
|
||||
}
|
||||
|
||||
coordmap <<- list(
|
||||
usr = c(
|
||||
usr = list(
|
||||
left = usrCoords[1],
|
||||
right = usrCoords[2],
|
||||
bottom = usrCoords[3],
|
||||
top = usrCoords[4]
|
||||
),
|
||||
# The bounds of the plot area, in DOM pixels
|
||||
bounds = c(
|
||||
left = grconvertX(usrBounds[1], 'user', 'nfc') * width,
|
||||
right = grconvertX(usrBounds[2], 'user', 'nfc') * width,
|
||||
bottom = (1-grconvertY(usrBounds[3], 'user', 'nfc')) * height,
|
||||
top = (1-grconvertY(usrBounds[4], 'user', 'nfc')) * height
|
||||
bounds = list(
|
||||
left = grconvertX(usrBounds[1], 'user', 'nfc') * width - 1,
|
||||
right = grconvertX(usrBounds[2], 'user', 'nfc') * width - 1,
|
||||
bottom = (1-grconvertY(usrBounds[3], 'user', 'nfc')) * height - 1,
|
||||
top = (1-grconvertY(usrBounds[4], 'user', 'nfc')) * height - 1
|
||||
),
|
||||
log = c(
|
||||
log = list(
|
||||
x = par('xlog'),
|
||||
y = par('ylog')
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user