mirror of
https://github.com/rstudio/shiny.git
synced 2026-04-07 03:00:20 -04:00
merged master -> barret/reactlog
This commit is contained in:
@@ -90,8 +90,9 @@ Suggests:
|
||||
URL: http://shiny.rstudio.com
|
||||
BugReports: https://github.com/rstudio/shiny/issues
|
||||
Remotes:
|
||||
tidyverse/ggplot2,
|
||||
rstudio/httpuv
|
||||
Collate:
|
||||
Collate:
|
||||
'app.R'
|
||||
'bookmark-state-local.R'
|
||||
'stack.R'
|
||||
|
||||
@@ -268,9 +268,13 @@ export(updateSliderInput)
|
||||
export(updateTabsetPanel)
|
||||
export(updateTextAreaInput)
|
||||
export(updateTextInput)
|
||||
export(updateVarSelectInput)
|
||||
export(updateVarSelectizeInput)
|
||||
export(urlModal)
|
||||
export(validate)
|
||||
export(validateCssUnit)
|
||||
export(varSelectInput)
|
||||
export(varSelectizeInput)
|
||||
export(verbatimTextOutput)
|
||||
export(verticalLayout)
|
||||
export(wellPanel)
|
||||
|
||||
26
NEWS.md
26
NEWS.md
@@ -1,3 +1,19 @@
|
||||
shiny 1.1.0.9000
|
||||
===========
|
||||
|
||||
## Full changelog
|
||||
|
||||
### Minor new features and improvements
|
||||
|
||||
* Support for selecting variables of a data frame with the output values to be used within tidy evaluation. Added functions: `varSelectInput`, `varSelectizeInput`, `updateVarSelectInput`, `updateVarSelectizeInput`. [#2091](https://github.com/rstudio/shiny/pull/2091)
|
||||
|
||||
* Addressed [#2042](https://github.com/rstudio/shiny/issues/2042): dates outside of `min`/`max` date range are now a lighter shade of grey to highlight the allowed range. [#2087](https://github.com/rstudio/shiny/pull/2087)
|
||||
|
||||
### Documentation Updates
|
||||
|
||||
* Addressed [#1864](https://github.com/rstudio/shiny/issues/1864) by changing `optgroup` documentation to use `list` instead of `c`. [#2084](https://github.com/rstudio/shiny/pull/2084)
|
||||
|
||||
|
||||
shiny 1.1.0
|
||||
===========
|
||||
|
||||
@@ -282,7 +298,7 @@ Now there's an official way to slow down reactive values and expressions that in
|
||||
### Minor new features and improvements
|
||||
|
||||
* Addressed [#1486](https://github.com/rstudio/shiny/issues/1486) by adding a new argument to `observeEvent` and `eventReactive`, called `ignoreInit` (defaults to `FALSE` for backwards compatibility). When set to `TRUE`, the action (i.e. the second argument: `handlerExpr` and `valueExpr`, respectively) will not be triggered when the observer/reactive is first created/initialized. In other words, `ignoreInit = TRUE` ensures that the `observeEvent` (or `eventReactive`) is *never* run right away. For more info, see the documentation (`?observeEvent`). ([#1494](https://github.com/rstudio/shiny/pull/1494))
|
||||
|
||||
|
||||
* Added a new argument to `observeEvent` called `once`. When set to `TRUE`, it results in the observer being destroyed (stop observing) after the first time that `handlerExpr` is run (i.e. `once = TRUE` guarantees that the observer only runs, at most, once). For more info, see the documentation (`?observeEvent`). ([#1494](https://github.com/rstudio/shiny/pull/1494))
|
||||
|
||||
* Addressed [#1358](https://github.com/rstudio/shiny/issues/1358): more informative error message when calling `runApp()` inside of an app's app.R (or inside ui.R or server.R). ([#1482](https://github.com/rstudio/shiny/pull/1482))
|
||||
@@ -681,7 +697,7 @@ shiny 0.12.1
|
||||
shiny 0.12.0
|
||||
============
|
||||
|
||||
In addition to the changes listed below (in the *Full Changelog* section), there is an infrastructure change that could affect existing Shiny apps.
|
||||
In addition to the changes listed below (in the *Full Changelog* section), there is an infrastructure change that could affect existing Shiny apps.
|
||||
|
||||
### JSON serialization
|
||||
|
||||
@@ -772,13 +788,13 @@ Shiny 0.11 switches away from the Bootstrap 2 web framework to the next version,
|
||||
### Known issues for migration
|
||||
|
||||
* In Bootstrap 3, images in `<img>` tags are no longer automatically scaled to the width of their container. If you use `img()` in your UI code, or `<img>` tags in your raw HTML source, it's possible that they will be too large in the new version of Shiny. To address this you can add the `img-responsive` class:
|
||||
|
||||
|
||||
```r
|
||||
img(src = "picture.png", class = "img-responsive")
|
||||
```
|
||||
|
||||
|
||||
The R code above will generate the following HTML:
|
||||
|
||||
|
||||
```html
|
||||
<img src="picture.png" class="img-responsive">
|
||||
```
|
||||
|
||||
140
R/input-select.R
140
R/input-select.R
@@ -33,7 +33,7 @@
|
||||
#' @return A select list control that can be added to a UI definition.
|
||||
#'
|
||||
#' @family input elements
|
||||
#' @seealso \code{\link{updateSelectInput}}
|
||||
#' @seealso \code{\link{updateSelectInput}} \code{\link{varSelectInput}}
|
||||
#'
|
||||
#' @examples
|
||||
#' ## Only run examples in interactive R sessions
|
||||
@@ -59,9 +59,9 @@
|
||||
#' shinyApp(
|
||||
#' ui = fluidPage(
|
||||
#' selectInput("state", "Choose a state:",
|
||||
#' list(`East Coast` = c("NY", "NJ", "CT"),
|
||||
#' `West Coast` = c("WA", "OR", "CA"),
|
||||
#' `Midwest` = c("MN", "WI", "IA"))
|
||||
#' list(`East Coast` = list("NY", "NJ", "CT"),
|
||||
#' `West Coast` = list("WA", "OR", "CA"),
|
||||
#' `Midwest` = list("MN", "WI", "IA"))
|
||||
#' ),
|
||||
#' textOutput("result")
|
||||
#' ),
|
||||
@@ -212,3 +212,135 @@ selectizeIt <- function(inputId, select, options, nonempty = FALSE) {
|
||||
|
||||
attachDependencies(select, selectizeDep)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#' Select variables from a data frame
|
||||
#'
|
||||
#' Create a select list that can be used to choose a single or multiple items
|
||||
#' from the column names of a data frame.
|
||||
#'
|
||||
#' The resulting server \code{input} value will be returned as:
|
||||
#' \itemize{
|
||||
#' \item a symbol if \code{multiple = FALSE}. The \code{input} value should be
|
||||
#' used with rlang's \code{\link[rlang]{!!}}. For example,
|
||||
#' \code{ggplot2::aes(!!input$variable)}.
|
||||
#' \item a list of symbols if \code{multiple = TRUE}. The \code{input} value
|
||||
#' should be used with rlang's \code{\link[rlang]{!!!}} to expand
|
||||
#' the symbol list as individual arguments. For example,
|
||||
#' \code{dplyr::select(mtcars, !!!input$variabls)} which is
|
||||
#' equivalent to \code{dplyr::select(mtcars, !!input$variabls[[1]], !!input$variabls[[2]], ..., !!input$variabls[[length(input$variabls)]])}.
|
||||
#' }
|
||||
#'
|
||||
#' By default, \code{varSelectInput()} and \code{selectizeInput()} use the
|
||||
#' JavaScript library \pkg{selectize.js}
|
||||
#' (\url{https://github.com/selectize/selectize.js}) to instead of the basic
|
||||
#' select input element. To use the standard HTML select input element, use
|
||||
#' \code{selectInput()} with \code{selectize=FALSE}.
|
||||
#'
|
||||
#' @inheritParams selectInput
|
||||
#' @param data A data frame. Used to retrieve the column names as choices for a \code{\link{selectInput}}
|
||||
#' @return A variable select list control that can be added to a UI definition.
|
||||
#'
|
||||
#' @family input elements
|
||||
#' @seealso \code{\link{updateSelectInput}}
|
||||
#' @examples
|
||||
#'
|
||||
#' ## Only run examples in interactive R sessions
|
||||
#' if (interactive()) {
|
||||
#'
|
||||
#' library(ggplot2)
|
||||
#'
|
||||
#' # single selection
|
||||
#' shinyApp(
|
||||
#' ui = fluidPage(
|
||||
#' varSelectInput("variable", "Variable:", mtcars),
|
||||
#' plotOutput("data")
|
||||
#' ),
|
||||
#' server = function(input, output) {
|
||||
#' output$data <- renderPlot({
|
||||
#' ggplot(mtcars, aes(!!input$variable)) + geom_histogram()
|
||||
#' })
|
||||
#' }
|
||||
#' )
|
||||
#'
|
||||
#'
|
||||
#' # multiple selections
|
||||
#' \dontrun{
|
||||
#' shinyApp(
|
||||
#' ui = fluidPage(
|
||||
#' varSelectInput("variables", "Variable:", mtcars, multiple = TRUE),
|
||||
#' tableOutput("data")
|
||||
#' ),
|
||||
#' server = function(input, output) {
|
||||
#' output$data <- renderTable({
|
||||
#' if (length(input$variables) == 0) return(mtcars)
|
||||
#' mtcars %>% dplyr::select(!!!input$variables)
|
||||
#' }, rownames = TRUE)
|
||||
#' }
|
||||
#' )}
|
||||
#'
|
||||
#' }
|
||||
#' @export
|
||||
varSelectInput <- function(
|
||||
inputId, label, data, selected = NULL,
|
||||
multiple = FALSE, selectize = TRUE, width = NULL,
|
||||
size = NULL
|
||||
) {
|
||||
# no place holders
|
||||
choices <- colnames(data)
|
||||
|
||||
selectInputVal <- selectInput(
|
||||
inputId = inputId,
|
||||
label = label,
|
||||
choices = choices,
|
||||
selected = selected,
|
||||
multiple = multiple,
|
||||
selectize = selectize,
|
||||
width = width,
|
||||
size = size
|
||||
)
|
||||
|
||||
# set the select tag class to be "symbol"
|
||||
selectClass <- selectInputVal$children[[2]]$children[[1]]$attribs$class
|
||||
if (is.null(selectClass)) {
|
||||
newClass <- "symbol"
|
||||
} else {
|
||||
newClass <- paste(selectClass, "symbol", sep = " ")
|
||||
}
|
||||
selectInputVal$children[[2]]$children[[1]]$attribs$class <- newClass
|
||||
|
||||
selectInputVal
|
||||
}
|
||||
|
||||
|
||||
|
||||
#' @rdname varSelectInput
|
||||
#' @param ... Arguments passed to \code{varSelectInput()}.
|
||||
#' @param options A list of options. See the documentation of \pkg{selectize.js}
|
||||
#' for possible options (character option values inside \code{\link[base]{I}()} will
|
||||
#' be treated as literal JavaScript code; see \code{\link{renderDataTable}()}
|
||||
#' for details).
|
||||
#' @param width The width of the input, e.g. \code{'400px'}, or \code{'100\%'};
|
||||
#' see \code{\link{validateCssUnit}}.
|
||||
#' @note The variable selectize input created from \code{varSelectizeInput()} allows
|
||||
#' deletion of the selected option even in a single select input, which will
|
||||
#' return an empty string as its value. This is the default behavior of
|
||||
#' \pkg{selectize.js}. However, the selectize input created from
|
||||
#' \code{selectInput(..., selectize = TRUE)} will ignore the empty string
|
||||
#' value when it is a single choice input and the empty string is not in the
|
||||
#' \code{choices} argument. This is to keep compatibility with
|
||||
#' \code{selectInput(..., selectize = FALSE)}.
|
||||
#' @export
|
||||
varSelectizeInput <- function(inputId, ..., options = NULL, width = NULL) {
|
||||
selectizeIt(
|
||||
inputId,
|
||||
varSelectInput(inputId, ..., selectize = FALSE, width = width),
|
||||
options
|
||||
)
|
||||
}
|
||||
|
||||
@@ -142,6 +142,7 @@ registerInputHandler("shiny.matrix", function(data, ...) {
|
||||
return(m)
|
||||
})
|
||||
|
||||
|
||||
registerInputHandler("shiny.number", function(val, ...){
|
||||
ifelse(is.null(val), NA, val)
|
||||
})
|
||||
@@ -220,3 +221,21 @@ registerInputHandler("shiny.file", function(val, shinysession, name) {
|
||||
|
||||
val
|
||||
})
|
||||
|
||||
|
||||
# to be used with !!!answer
|
||||
registerInputHandler("shiny.symbolList", function(val, ...) {
|
||||
if (is.null(val)) {
|
||||
list()
|
||||
} else {
|
||||
lapply(val, as.symbol)
|
||||
}
|
||||
})
|
||||
# to be used with !!answer
|
||||
registerInputHandler("shiny.symbol", function(val, ...) {
|
||||
if (is.null(val) || identical(val, "")) {
|
||||
NULL
|
||||
} else {
|
||||
as.symbol(val)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -576,7 +576,7 @@ updateRadioButtons <- function(session, inputId, label = NULL, choices = NULL,
|
||||
#' @template update-input
|
||||
#' @inheritParams selectInput
|
||||
#'
|
||||
#' @seealso \code{\link{selectInput}}
|
||||
#' @seealso \code{\link{selectInput}} \code{\link{varSelectInput}}
|
||||
#'
|
||||
#' @examples
|
||||
#' ## Only run examples in interactive R sessions
|
||||
@@ -673,6 +673,43 @@ updateSelectizeInput <- function(session, inputId, label = NULL, choices = NULL,
|
||||
))
|
||||
session$sendInputMessage(inputId, message)
|
||||
}
|
||||
#' @rdname updateSelectInput
|
||||
#' @inheritParams varSelectInput
|
||||
#' @export
|
||||
updateVarSelectInput <- function(session, inputId, label = NULL, data = NULL, selected = NULL) {
|
||||
if (is.null(data)) {
|
||||
choices <- NULL
|
||||
} else {
|
||||
choices <- colnames(data)
|
||||
}
|
||||
updateSelectInput(
|
||||
session = session,
|
||||
inputId = inputId,
|
||||
label = label,
|
||||
choices = choices,
|
||||
selected = selected
|
||||
)
|
||||
}
|
||||
#' @rdname updateSelectInput
|
||||
#' @export
|
||||
updateVarSelectizeInput <- function(session, inputId, label = NULL, data = NULL, selected = NULL, options = list(), server = FALSE) {
|
||||
if (is.null(data)) {
|
||||
choices <- NULL
|
||||
} else {
|
||||
choices <- colnames(data)
|
||||
}
|
||||
updateSelectizeInput(
|
||||
session = session,
|
||||
inputId = inputId,
|
||||
label = label,
|
||||
choices = choices,
|
||||
selected = selected,
|
||||
options = options,
|
||||
server = server
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
|
||||
selectizeJSON <- function(data, req) {
|
||||
query <- parseQueryString(req$QUERY_STRING)
|
||||
|
||||
@@ -41,6 +41,7 @@ sd_section("UI Inputs",
|
||||
"numericInput",
|
||||
"radioButtons",
|
||||
"selectInput",
|
||||
"varSelectInput",
|
||||
"sliderInput",
|
||||
"submitButton",
|
||||
"textInput",
|
||||
|
||||
@@ -381,3 +381,10 @@ pre.shiny-text-output.noplaceholder:empty {
|
||||
.shiny-file-input-over {
|
||||
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(76, 174, 76, .6);
|
||||
}
|
||||
|
||||
/* Overrides bootstrap-datepicker3.css styling for invalid date ranges.
|
||||
See https://github.com/rstudio/shiny/issues/2042 for details. */
|
||||
.datepicker table tbody tr td.disabled,
|
||||
.datepicker table tbody tr td.disabled:hover {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
||||
|
||||
var exports = window.Shiny = window.Shiny || {};
|
||||
|
||||
exports.version = "{{ VERSION }}"; // Version number inserted by Grunt
|
||||
exports.version = "1.1.0.9000"; // Version number inserted by Grunt
|
||||
|
||||
var origPushState = window.history.pushState;
|
||||
window.history.pushState = function () {
|
||||
@@ -5036,6 +5036,18 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
||||
find: function find(scope) {
|
||||
return $(scope).find('select');
|
||||
},
|
||||
getType: function getType(el) {
|
||||
var $el = $(el);
|
||||
if (!$el.hasClass("symbol")) {
|
||||
// default character type
|
||||
return null;
|
||||
}
|
||||
if ($el.attr("multiple") === "multiple") {
|
||||
return 'shiny.symbolList';
|
||||
} else {
|
||||
return 'shiny.symbol';
|
||||
}
|
||||
},
|
||||
getId: function getId(el) {
|
||||
return InputBinding.prototype.getId.call(this, el) || el.name;
|
||||
},
|
||||
|
||||
File diff suppressed because one or more lines are too long
4
inst/www/shared/shiny.min.js
vendored
4
inst/www/shared/shiny.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -62,6 +62,7 @@ Other input elements: \code{\link{checkboxGroupInput}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{radioButtons}}, \code{\link{selectInput}},
|
||||
\code{\link{sliderInput}}, \code{\link{submitButton}},
|
||||
\code{\link{textAreaInput}}, \code{\link{textInput}}
|
||||
\code{\link{textAreaInput}}, \code{\link{textInput}},
|
||||
\code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -93,6 +93,7 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{radioButtons}}, \code{\link{selectInput}},
|
||||
\code{\link{sliderInput}}, \code{\link{submitButton}},
|
||||
\code{\link{textAreaInput}}, \code{\link{textInput}}
|
||||
\code{\link{textAreaInput}}, \code{\link{textInput}},
|
||||
\code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -46,6 +46,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{passwordInput}}, \code{\link{radioButtons}},
|
||||
\code{\link{selectInput}}, \code{\link{sliderInput}},
|
||||
\code{\link{submitButton}}, \code{\link{textAreaInput}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -107,6 +107,7 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{radioButtons}}, \code{\link{selectInput}},
|
||||
\code{\link{sliderInput}}, \code{\link{submitButton}},
|
||||
\code{\link{textAreaInput}}, \code{\link{textInput}}
|
||||
\code{\link{textAreaInput}}, \code{\link{textInput}},
|
||||
\code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -124,6 +124,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{passwordInput}}, \code{\link{radioButtons}},
|
||||
\code{\link{selectInput}}, \code{\link{sliderInput}},
|
||||
\code{\link{submitButton}}, \code{\link{textAreaInput}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -97,6 +97,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{passwordInput}}, \code{\link{radioButtons}},
|
||||
\code{\link{selectInput}}, \code{\link{sliderInput}},
|
||||
\code{\link{submitButton}}, \code{\link{textAreaInput}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -53,6 +53,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{passwordInput}}, \code{\link{radioButtons}},
|
||||
\code{\link{selectInput}}, \code{\link{sliderInput}},
|
||||
\code{\link{submitButton}}, \code{\link{textAreaInput}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -55,6 +55,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{numericInput}}, \code{\link{radioButtons}},
|
||||
\code{\link{selectInput}}, \code{\link{sliderInput}},
|
||||
\code{\link{submitButton}}, \code{\link{textAreaInput}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -109,6 +109,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{selectInput}}, \code{\link{sliderInput}},
|
||||
\code{\link{submitButton}}, \code{\link{textAreaInput}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -98,9 +98,9 @@ shinyApp(
|
||||
shinyApp(
|
||||
ui = fluidPage(
|
||||
selectInput("state", "Choose a state:",
|
||||
list(`East Coast` = c("NY", "NJ", "CT"),
|
||||
`West Coast` = c("WA", "OR", "CA"),
|
||||
`Midwest` = c("MN", "WI", "IA"))
|
||||
list(`East Coast` = list("NY", "NJ", "CT"),
|
||||
`West Coast` = list("WA", "OR", "CA"),
|
||||
`Midwest` = list("MN", "WI", "IA"))
|
||||
),
|
||||
textOutput("result")
|
||||
),
|
||||
@@ -113,7 +113,7 @@ shinyApp(
|
||||
}
|
||||
}
|
||||
\seealso{
|
||||
\code{\link{updateSelectInput}}
|
||||
\code{\link{updateSelectInput}} \code{\link{varSelectInput}}
|
||||
|
||||
Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{checkboxGroupInput}},
|
||||
@@ -122,6 +122,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{radioButtons}}, \code{\link{sliderInput}},
|
||||
\code{\link{submitButton}}, \code{\link{textAreaInput}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -125,6 +125,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{radioButtons}}, \code{\link{selectInput}},
|
||||
\code{\link{submitButton}}, \code{\link{textAreaInput}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -72,6 +72,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{radioButtons}}, \code{\link{selectInput}},
|
||||
\code{\link{sliderInput}}, \code{\link{textAreaInput}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -68,6 +68,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{radioButtons}}, \code{\link{selectInput}},
|
||||
\code{\link{sliderInput}}, \code{\link{submitButton}},
|
||||
\code{\link{textInput}}
|
||||
\code{\link{textInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -50,6 +50,6 @@ Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{radioButtons}}, \code{\link{selectInput}},
|
||||
\code{\link{sliderInput}}, \code{\link{submitButton}},
|
||||
\code{\link{textAreaInput}}
|
||||
\code{\link{textAreaInput}}, \code{\link{varSelectInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
\name{updateSelectInput}
|
||||
\alias{updateSelectInput}
|
||||
\alias{updateSelectizeInput}
|
||||
\alias{updateVarSelectInput}
|
||||
\alias{updateVarSelectizeInput}
|
||||
\title{Change the value of a select input on the client}
|
||||
\usage{
|
||||
updateSelectInput(session, inputId, label = NULL, choices = NULL,
|
||||
@@ -10,6 +12,12 @@ updateSelectInput(session, inputId, label = NULL, choices = NULL,
|
||||
|
||||
updateSelectizeInput(session, inputId, label = NULL, choices = NULL,
|
||||
selected = NULL, options = list(), server = FALSE)
|
||||
|
||||
updateVarSelectInput(session, inputId, label = NULL, data = NULL,
|
||||
selected = NULL)
|
||||
|
||||
updateVarSelectizeInput(session, inputId, label = NULL, data = NULL,
|
||||
selected = NULL, options = list(), server = FALSE)
|
||||
}
|
||||
\arguments{
|
||||
\item{session}{The \code{session} object passed to function given to
|
||||
@@ -40,6 +48,8 @@ for details).}
|
||||
the select options dynamically on searching, instead of writing all
|
||||
\code{choices} into the page at once (i.e., only use the client-side
|
||||
version of \pkg{selectize.js})}
|
||||
|
||||
\item{data}{A data frame. Used to retrieve the column names as choices for a \code{\link{selectInput}}}
|
||||
}
|
||||
\description{
|
||||
Change the value of a select input on the client
|
||||
@@ -94,5 +104,5 @@ shinyApp(ui, server)
|
||||
}
|
||||
}
|
||||
\seealso{
|
||||
\code{\link{selectInput}}
|
||||
\code{\link{selectInput}} \code{\link{varSelectInput}}
|
||||
}
|
||||
|
||||
129
man/varSelectInput.Rd
Normal file
129
man/varSelectInput.Rd
Normal file
@@ -0,0 +1,129 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/input-select.R
|
||||
\name{varSelectInput}
|
||||
\alias{varSelectInput}
|
||||
\alias{varSelectizeInput}
|
||||
\title{Select variables from a data frame}
|
||||
\usage{
|
||||
varSelectInput(inputId, label, data, selected = NULL, multiple = FALSE,
|
||||
selectize = TRUE, width = NULL, size = NULL)
|
||||
|
||||
varSelectizeInput(inputId, ..., options = NULL, width = NULL)
|
||||
}
|
||||
\arguments{
|
||||
\item{inputId}{The \code{input} slot that will be used to access the value.}
|
||||
|
||||
\item{label}{Display label for the control, or \code{NULL} for no label.}
|
||||
|
||||
\item{data}{A data frame. Used to retrieve the column names as choices for a \code{\link{selectInput}}}
|
||||
|
||||
\item{selected}{The initially selected value (or multiple values if
|
||||
\code{multiple = TRUE}). If not specified then defaults to the first value
|
||||
for single-select lists and no values for multiple select lists.}
|
||||
|
||||
\item{multiple}{Is selection of multiple items allowed?}
|
||||
|
||||
\item{selectize}{Whether to use \pkg{selectize.js} or not.}
|
||||
|
||||
\item{width}{The width of the input, e.g. \code{'400px'}, or \code{'100\%'};
|
||||
see \code{\link{validateCssUnit}}.}
|
||||
|
||||
\item{size}{Number of items to show in the selection box; a larger number
|
||||
will result in a taller box. Not compatible with \code{selectize=TRUE}.
|
||||
Normally, when \code{multiple=FALSE}, a select input will be a drop-down
|
||||
list, but when \code{size} is set, it will be a box instead.}
|
||||
|
||||
\item{...}{Arguments passed to \code{varSelectInput()}.}
|
||||
|
||||
\item{options}{A list of options. See the documentation of \pkg{selectize.js}
|
||||
for possible options (character option values inside \code{\link[base]{I}()} will
|
||||
be treated as literal JavaScript code; see \code{\link{renderDataTable}()}
|
||||
for details).}
|
||||
}
|
||||
\value{
|
||||
A variable select list control that can be added to a UI definition.
|
||||
}
|
||||
\description{
|
||||
Create a select list that can be used to choose a single or multiple items
|
||||
from the column names of a data frame.
|
||||
}
|
||||
\details{
|
||||
The resulting server \code{input} value will be returned as:
|
||||
\itemize{
|
||||
\item a symbol if \code{multiple = FALSE}. The \code{input} value should be
|
||||
used with rlang's \code{\link[rlang]{!!}}. For example,
|
||||
\code{ggplot2::aes(!!input$variable)}.
|
||||
\item a list of symbols if \code{multiple = TRUE}. The \code{input} value
|
||||
should be used with rlang's \code{\link[rlang]{!!!}} to expand
|
||||
the symbol list as individual arguments. For example,
|
||||
\code{dplyr::select(mtcars, !!!input$variabls)} which is
|
||||
equivalent to \code{dplyr::select(mtcars, !!input$variabls[[1]], !!input$variabls[[2]], ..., !!input$variabls[[length(input$variabls)]])}.
|
||||
}
|
||||
|
||||
By default, \code{varSelectInput()} and \code{selectizeInput()} use the
|
||||
JavaScript library \pkg{selectize.js}
|
||||
(\url{https://github.com/selectize/selectize.js}) to instead of the basic
|
||||
select input element. To use the standard HTML select input element, use
|
||||
\code{selectInput()} with \code{selectize=FALSE}.
|
||||
}
|
||||
\note{
|
||||
The variable selectize input created from \code{varSelectizeInput()} allows
|
||||
deletion of the selected option even in a single select input, which will
|
||||
return an empty string as its value. This is the default behavior of
|
||||
\pkg{selectize.js}. However, the selectize input created from
|
||||
\code{selectInput(..., selectize = TRUE)} will ignore the empty string
|
||||
value when it is a single choice input and the empty string is not in the
|
||||
\code{choices} argument. This is to keep compatibility with
|
||||
\code{selectInput(..., selectize = FALSE)}.
|
||||
}
|
||||
\examples{
|
||||
|
||||
## Only run examples in interactive R sessions
|
||||
if (interactive()) {
|
||||
|
||||
library(ggplot2)
|
||||
|
||||
# single selection
|
||||
shinyApp(
|
||||
ui = fluidPage(
|
||||
varSelectInput("variable", "Variable:", mtcars),
|
||||
plotOutput("data")
|
||||
),
|
||||
server = function(input, output) {
|
||||
output$data <- renderPlot({
|
||||
ggplot(mtcars, aes(!!input$variable)) + geom_histogram()
|
||||
})
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
# multiple selections
|
||||
\dontrun{
|
||||
shinyApp(
|
||||
ui = fluidPage(
|
||||
varSelectInput("variables", "Variable:", mtcars, multiple = TRUE),
|
||||
tableOutput("data")
|
||||
),
|
||||
server = function(input, output) {
|
||||
output$data <- renderTable({
|
||||
if (length(input$variables) == 0) return(mtcars)
|
||||
mtcars \%>\% dplyr::select(!!!input$variables)
|
||||
}, rownames = TRUE)
|
||||
}
|
||||
)}
|
||||
|
||||
}
|
||||
}
|
||||
\seealso{
|
||||
\code{\link{updateSelectInput}}
|
||||
|
||||
Other input elements: \code{\link{actionButton}},
|
||||
\code{\link{checkboxGroupInput}},
|
||||
\code{\link{checkboxInput}}, \code{\link{dateInput}},
|
||||
\code{\link{dateRangeInput}}, \code{\link{fileInput}},
|
||||
\code{\link{numericInput}}, \code{\link{passwordInput}},
|
||||
\code{\link{radioButtons}}, \code{\link{selectInput}},
|
||||
\code{\link{sliderInput}}, \code{\link{submitButton}},
|
||||
\code{\link{textAreaInput}}, \code{\link{textInput}}
|
||||
}
|
||||
\concept{input elements}
|
||||
@@ -3,6 +3,18 @@ $.extend(selectInputBinding, {
|
||||
find: function(scope) {
|
||||
return $(scope).find('select');
|
||||
},
|
||||
getType: function(el) {
|
||||
var $el = $(el);
|
||||
if (!$el.hasClass("symbol")) {
|
||||
// default character type
|
||||
return null;
|
||||
}
|
||||
if ($el.attr("multiple") === "multiple") {
|
||||
return 'shiny.symbolList';
|
||||
} else {
|
||||
return 'shiny.symbol';
|
||||
}
|
||||
},
|
||||
getId: function(el) {
|
||||
return InputBinding.prototype.getId.call(this, el) || el.name;
|
||||
},
|
||||
|
||||
@@ -48,3 +48,34 @@ test_that("Nulls are not converted to NAs in parsing", {
|
||||
list(method="init", data=list(obs=500L, nullObs=NULL))
|
||||
)
|
||||
})
|
||||
|
||||
|
||||
test_that("characters turn into symbols", {
|
||||
handler <- inputHandlers$get("shiny.symbol")
|
||||
x <- "mpg"
|
||||
expect_identical(
|
||||
handler(x),
|
||||
as.symbol(x)
|
||||
)
|
||||
expect_identical(
|
||||
handler(NULL),
|
||||
NULL
|
||||
)
|
||||
})
|
||||
test_that("character vectors turn into symbol lists", {
|
||||
handler <- inputHandlers$get("shiny.symbolList")
|
||||
x <- list("mpg")
|
||||
expect_identical(
|
||||
handler(x),
|
||||
list(as.symbol(x[[1]]))
|
||||
)
|
||||
x <- list("mpg", "cyl", "disp")
|
||||
expect_identical(
|
||||
handler(x),
|
||||
list(as.symbol(x[[1]]), as.symbol(x[[2]]), as.symbol(x[[3]]))
|
||||
)
|
||||
expect_identical(
|
||||
handler(NULL),
|
||||
list()
|
||||
)
|
||||
})
|
||||
|
||||
@@ -21,3 +21,42 @@ test_that("sliderInput steps don't have rounding errors", {
|
||||
# Need to use expect_identical; expect_equal is too forgiving of rounding error
|
||||
expect_identical(findStepSize(-5.5, 4, NULL), 0.1)
|
||||
})
|
||||
|
||||
|
||||
test_that("selectInputUI has a select at an expected location", {
|
||||
for (multiple in c(TRUE, FALSE)) {
|
||||
for (selected in list(NULL, "", "A")) {
|
||||
for (selectize in c(TRUE, FALSE)) {
|
||||
selectInputVal <- selectInput(
|
||||
inputId = "testId",
|
||||
label = "test label",
|
||||
choices = c("A", "B", "C"),
|
||||
selected = selected,
|
||||
multiple = multiple,
|
||||
selectize = selectize
|
||||
)
|
||||
# if this getter is changed, varSelectInput getter needs to be changed
|
||||
selectHtml <- selectInputVal$children[[2]]$children[[1]]
|
||||
expect_true(inherits(selectHtml, "shiny.tag"))
|
||||
expect_equal(selectHtml$name, "select")
|
||||
if (!is.null(selectHtml$attribs$class)) {
|
||||
expect_false(grepl(selectHtml$attribs$class, "symbol"))
|
||||
}
|
||||
|
||||
varSelectInputVal <- varSelectInput(
|
||||
inputId = "testId",
|
||||
label = "test label",
|
||||
data = data.frame(A = 1:2, B = 3:4, C = 5:6),
|
||||
selected = selected,
|
||||
multiple = multiple,
|
||||
selectize = selectize
|
||||
)
|
||||
# if this getter is changed, varSelectInput getter needs to be changed
|
||||
varSelectHtml <- varSelectInputVal$children[[2]]$children[[1]]
|
||||
expect_true(inherits(varSelectHtml, "shiny.tag"))
|
||||
expect_equal(varSelectHtml$name, "select")
|
||||
expect_true(grepl("symbol", varSelectHtml$attribs$class, fixed = TRUE))
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user