Title: | Add Even More Interactivity to Interactive Charts |
---|---|
Description: | Like package 'manipulate' does for static graphics, this package helps to easily add controls like sliders, pickers, checkboxes, etc. that can be used to modify the input data or the parameters of an interactive chart created with package 'htmlwidgets'. |
Authors: | Veronique Bachelier [aut, cre], Jalal-Edine ZAWAM [aut], Francois Guillem [aut], RTE [cph], JJ Allaire [ctb], Marion Praz [ctb] (New user interface), Benoit Thieurmel [ctb], Titouan Robert [ctb], Duncan Murdoch [ctb] |
Maintainer: | Veronique Bachelier <[email protected]> |
License: | GPL (>= 2) | file LICENSE |
Version: | 0.11.1 |
Built: | 2025-01-30 03:07:23 UTC |
Source: | https://github.com/rte-antares-rpackage/manipulatewidget |
This package is largely inspired by the manipulate
package from
Rstudio. It can be used to easily create graphical interface that let the
user modify the data or the parameters of an interactive chart. It also
provides the combineWidgets
function to easily combine multiple
interactive charts in a single view.
manipulateWidget
is the main function of the package. It
accepts an expression that generates an interactive chart (and more precisely
an htmlwidget
object. See http://www.htmlwidgets.org/ if you
have never heard about it) and a set of controls created with functions
mwSlider
, mwCheckbox
... which are used to dynamically change
values within the expression. Each time the user modifies the value of a
control, the expression is evaluated again and the chart is updated. Consider
the following code:
manipulateWidget(myPlotFun(country), country = mwSelect(c("BE", "DE", "ES", "FR")))
It will generate a graphical interface with a select input on its left with
options "BE", "DE", "ES", "FR". By default, at the beginning the value of the
variable country
will be equal to the first choice of the
corresponding input. So the function will first execute
myPlotFun("BE")
and the result will be displayed in the main panel of
the interface. If the user changes the value to "FR", then the expression
myPlotFun("FR")
is evaluated and the new result is displayed.
The interface also contains a button "Done". When the user clicks on it, the
last chart is returned. It can be stored in a variable, be modified by the
user, saved as a html file with saveWidget
from package
htmlwidgets
or converted to a static image file with package
webshot
.
Finally one can easily create complex layouts thanks to function
combineWidgets
. For instance, assume we want to see a map that
displays values of some variable for a given year, but on its right side we also
want to see the distributions of three variables. Then we could write:
myPlotFun <- function(year, variable) { combineWidgets( ncol = 2, colSize = c(3, 1), myMap(year, variable), combineWidgets( ncol = 1, myHist(year, "V1"), myHist(year, "V2"), myHist(year, "V3"), ) ) } manipulateWidget( myPlotFun(year, variable), year = mwSlider(2000, 2016, value = 2000), variable = mwSelect(c("V1", "V2", "V3")) )
Of course, combineWidgets
can be used outside of
manipulateWidget
. For instance, it can be used in an
Rmarkdown document to easily put together interactive charts.
For more concrete examples of usage, you should look at the documentation and
especially the examples of manipulateWidget
and
combineWidgets
.
manipulateWidget
, combineWidgets
This function combines different htmlwidgets in a unique view.
combineWidgets( ..., list = NULL, nrow = NULL, ncol = NULL, title = NULL, rowsize = 1, colsize = 1, byrow = TRUE, titleCSS = "", header = NULL, footer = NULL, leftCol = NULL, rightCol = NULL, width = NULL, height = NULL )
combineWidgets( ..., list = NULL, nrow = NULL, ncol = NULL, title = NULL, rowsize = 1, colsize = 1, byrow = TRUE, titleCSS = "", header = NULL, footer = NULL, leftCol = NULL, rightCol = NULL, width = NULL, height = NULL )
... |
htmlwidgets to combine. If this list contains objects that are not htmlwidgets, the function tries to convert them into a character string which is interpreted as html content. |
list |
Instead of directly passing htmlwidgets to the function, one can
pass a list of htmlwidgets and objects coercible to character. In particular,
it can be usefull if multiple htmlwidgets have been generated using a loop
function like |
nrow |
Number of rows of the layout. If |
ncol |
Number of columns of the layout.If |
title |
Title of the view. |
rowsize |
This argument controls the relative size of each row. For
instance, if the layout has two rows and |
colsize |
Same as rowsize but for the height of the columns of the layout. |
byrow |
If |
titleCSS |
A character containing css properties to modify the appearance of the title of the view. |
header |
Content to display between the title and the combined widgets. It can be a single character string or html tags. |
footer |
Content to display under the combined widgets. It can be a single character string or html tags. |
leftCol |
Content to display on the left of the combined widgets. It can be a single character string or html tags. |
rightCol |
Content to display on the right the combined widgets. It can be a single character string or html tags. |
width |
Total width of the layout (optional, defaults to automatic sizing). |
height |
Total height of the layout (optional, defaults to automatic sizing). |
The function only allows table like layout : each row has the same number of columns and reciprocally. But it is possible to create more complex layout by nesting combined htmlwidgets. (see examples)
A htmlwidget object of class combineWidget
. Individual widgets
are stored in element widgets
and can be extracted or updated. This
is useful when a function returns a combineWidgets
object but user
wants to keep only one widget or to update one of them (see examples).
if (require(plotly)) { data(iris) combineWidgets(title = "The Iris dataset", plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Sepal.Width, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Petal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Petal.Width, type = "histogram", nbinsx = 20) ) # Create a more complex layout by nesting combinedWidgets combineWidgets(title = "The iris data set: sepals", ncol = 2, colsize = c(2,1), plot_ly(iris, x = ~Sepal.Length, y = ~Sepal.Width, type = "scatter", mode = "markers", color = ~Species), combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Sepal.Width, type = "histogram", nbinsx = 20) ) ) # combineWidgets can also be used on a single widget to easily add to it a # title and a footer. require(shiny) comments <- tags$div( "Wow this plot is so ", tags$span("amazing!!", style = "color:red;font-size:36px") ) combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), title = "Distribution of Sepal Length", footer = comments ) # It is also possible to combine htmlwidgets with text or other html elements myComment <- tags$div( style="height:100%;background-color:#eee;padding:10px;box-sizing:border-box", tags$h2("Comment"), tags$hr(), "Here is a very clever comment about the awesome graphics you just saw." ) combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Sepal.Width, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Petal.Length, type = "histogram", nbinsx = 20), myComment ) # Updating individual widgets. myWidget <- combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Sepal.Width, type = "histogram", nbinsx = 20), ncol = 2 ) myWidget myWidget$widgets[[1]] <- myWidget$widgets[[1]] %>% layout(title = "Histogram of Sepal Length") myWidget$widgets[[2]] <- myWidget$widgets[[2]] %>% layout(title = "Histogram of Sepal Width") myWidget # Instead of passing directly htmlwidgets to the function, one can pass # a list containing htmlwidgets. This is especially useful when the widgets # are generated using a loop function like "lapply" or "replicate". # # The following code generates a list of 12 histograms and use combineWidgets # to display them. samples <- replicate(12, plot_ly(x = rnorm(100), type = "histogram", nbinsx = 20), simplify = FALSE) combineWidgets(list = samples, title = "12 samples of the same distribution") }
if (require(plotly)) { data(iris) combineWidgets(title = "The Iris dataset", plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Sepal.Width, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Petal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Petal.Width, type = "histogram", nbinsx = 20) ) # Create a more complex layout by nesting combinedWidgets combineWidgets(title = "The iris data set: sepals", ncol = 2, colsize = c(2,1), plot_ly(iris, x = ~Sepal.Length, y = ~Sepal.Width, type = "scatter", mode = "markers", color = ~Species), combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Sepal.Width, type = "histogram", nbinsx = 20) ) ) # combineWidgets can also be used on a single widget to easily add to it a # title and a footer. require(shiny) comments <- tags$div( "Wow this plot is so ", tags$span("amazing!!", style = "color:red;font-size:36px") ) combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), title = "Distribution of Sepal Length", footer = comments ) # It is also possible to combine htmlwidgets with text or other html elements myComment <- tags$div( style="height:100%;background-color:#eee;padding:10px;box-sizing:border-box", tags$h2("Comment"), tags$hr(), "Here is a very clever comment about the awesome graphics you just saw." ) combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Sepal.Width, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Petal.Length, type = "histogram", nbinsx = 20), myComment ) # Updating individual widgets. myWidget <- combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), plot_ly(iris, x = ~Sepal.Width, type = "histogram", nbinsx = 20), ncol = 2 ) myWidget myWidget$widgets[[1]] <- myWidget$widgets[[1]] %>% layout(title = "Histogram of Sepal Length") myWidget$widgets[[2]] <- myWidget$widgets[[2]] %>% layout(title = "Histogram of Sepal Width") myWidget # Instead of passing directly htmlwidgets to the function, one can pass # a list containing htmlwidgets. This is especially useful when the widgets # are generated using a loop function like "lapply" or "replicate". # # The following code generates a list of 12 histograms and use combineWidgets # to display them. samples <- replicate(12, plot_ly(x = rnorm(100), type = "histogram", nbinsx = 20), simplify = FALSE) combineWidgets(list = samples, title = "12 samples of the same distribution") }
Output and render functions for using combineWidgets within Shiny applications and interactive Rmd documents.
combineWidgetsOutput(outputId, width = "100%", height = "400px") renderCombineWidgets(expr, env = parent.frame(), quoted = FALSE)
combineWidgetsOutput(outputId, width = "100%", height = "400px") renderCombineWidgets(expr, env = parent.frame(), quoted = FALSE)
outputId |
output variable to read from |
width , height
|
Must be a valid CSS unit (like |
expr |
An expression that generates a combineWidgets |
env |
The environment in which to evaluate |
quoted |
Is |
This function generates a list of options that are used by
manipulateWidget
to compare multiple charts.
compareOptions(ncharts = NULL, nrow = NULL, ncol = NULL, allowCompare = TRUE)
compareOptions(ncharts = NULL, nrow = NULL, ncol = NULL, allowCompare = TRUE)
ncharts |
Number of charts to generate. |
nrow |
Number of rows. If |
ncol |
Number of columns. If |
allowCompare |
If |
List of options
if (require(dygraphs)) { mydata <- data.frame( year = 2000+1:100, series1 = rnorm(100), series2 = rnorm(100), series3 = rnorm(100) ) manipulateWidget( dygraph(mydata[range[1]:range[2] - 2000, c("year", series)], main = title), range = mwSlider(2001, 2100, c(2001, 2100)), series = mwSelect(c("series1", "series2", "series3")), title = mwText("Fictive time series"), .compare = list(title = NULL, series = NULL), .compareOpts = compareOptions(ncharts = 4) ) manipulateWidget( dygraph(mydata[range[1]:range[2] - 2000, c("year", series)], main = title), range = mwSlider(2001, 2100, c(2001, 2100)), series = mwSelect(c("series1", "series2", "series3")), title = mwText("Fictive time series"), .compare = list(title = NULL, series = NULL), .compareOpts = compareOptions(ncharts = 3, nrow = 3) ) }
if (require(dygraphs)) { mydata <- data.frame( year = 2000+1:100, series1 = rnorm(100), series2 = rnorm(100), series3 = rnorm(100) ) manipulateWidget( dygraph(mydata[range[1]:range[2] - 2000, c("year", series)], main = title), range = mwSlider(2001, 2100, c(2001, 2100)), series = mwSelect(c("series1", "series2", "series3")), title = mwText("Fictive time series"), .compare = list(title = NULL, series = NULL), .compareOpts = compareOptions(ncharts = 4) ) manipulateWidget( dygraph(mydata[range[1]:range[2] - 2000, c("year", series)], main = title), range = mwSlider(2001, 2100, c(2001, 2100)), series = mwSelect(c("series1", "series2", "series3")), title = mwText("Fictive time series"), .compare = list(title = NULL, series = NULL), .compareOpts = compareOptions(ncharts = 3, nrow = 3) ) }
knit_print method for MWController object
knit_print.MWController(x, ...)
knit_print.MWController(x, ...)
x |
MWController object |
... |
arguments passed to function knit_print |
This function permits to add controls to an interactive plot created with
packages like dygraphs
, highcharter
or plotly
in order
to change the input data or the parameters of the plot.
Technically, the function starts a shiny gadget. The R session is bloqued until the user clicks on "cancel" or "done". If he clicks on "done", then the the function returns the last displayed plot so the user can modify it and/or save it.
manipulateWidget( .expr, ..., .updateBtn = FALSE, .saveBtn = TRUE, .exportBtn = TRUE, .exportType = c("html2canvas", "webshot"), .viewer = c("pane", "window", "browser"), .compare = NULL, .compareOpts = compareOptions(), .translations = mwTranslations(), .return = function(widget, envs) { widget }, .width = NULL, .height = NULL, .runApp = TRUE )
manipulateWidget( .expr, ..., .updateBtn = FALSE, .saveBtn = TRUE, .exportBtn = TRUE, .exportType = c("html2canvas", "webshot"), .viewer = c("pane", "window", "browser"), .compare = NULL, .compareOpts = compareOptions(), .translations = mwTranslations(), .return = function(widget, envs) { widget }, .width = NULL, .height = NULL, .runApp = TRUE )
.expr |
expression to evaluate that returns an interactive plot of class
|
... |
One or more named control arguments created with functions
|
.updateBtn |
Should an update button be added to the controls ? If
|
.saveBtn |
Should an save button be added to the controls ? For saving output as html. Does not work in RStudio Viewer |
.exportBtn |
Should an export button be added to the controls ? For saving output as png. Does not work in RStudio Viewer |
.exportType |
|
.viewer |
Controls where the gadget should be displayed. |
.compare |
Sometimes one wants to compare the same chart but with two
different sets of parameters. This is the purpose of this argument. It can
be a character vector of input names or a named list whose names are the
names of the inputs that should vary between the two charts. Each element
of the list must be a vector or a list of length equal to the number of
charts with the initial values of the corresponding parameter for each
chart. It can also be |
.compareOpts |
List of options created |
.translations |
List of translation strings created with function
|
.return |
A function that can be used to modify the output of
|
.width |
Width of the UI. Used only on Rmarkdown documents with option
|
.height |
Height of the UI. Used only on Rmarkdown documents with option
|
.runApp |
(advanced usage) If true, a shiny gadget is started. If false,
the function returns a |
The result of the expression evaluated with the last values of the controls.
It should be an object of class htmlWidget
.
The "normal" use of the function is to provide an expression that always
return an htmlwidget
. In such case, every time the user changes the
value of an input, the current widget is destroyed and a new one is created
and rendered.
Some packages provide functions to update a widget that has already been
rendered. This is the case for instance for package leaflet
with the
function leafletProxy
. To use such functions,
manipulateWidget
evaluates the parameter .expr
with four extra
variables:
.initial
:
TRUE
if the expression is evaluated for the first time and then
the widget has not been rendered yet, FALSE
if the widget has
already been rendered.
.session
:
A shiny session object.
.output
:
ID of the output in the shiny interface.
.id
:
Id of the chart. It can be used in comparison mode to make further
customization without the need to create additional input controls.
You can take a look at the last example to see how to use these two variables to update a leaflet widget.
In some specific situations, a developer may want to use
manipulateWidget
in a function that waits the user to click on the
"Done" button and modifies the widget returned by manipulateWidget
.
In such situation, parameter .return
should be used so that
manipulateWidget
is the last function called. Indeed, if other code
is present after, the custom function will act very weird in a Rmarkdown
document with "runtime: shiny".
# Basic example with fake data if (require(dygraphs)) { mydata <- data.frame(period = 1:100, value = rnorm(100)) manipulateWidget(dygraph(mydata[range[1]:range[2], ], main = title), range = mwSlider(1, 100, c(1, 100)), title = mwText("Fictive time series")) } # Let use manipulateWidget to explore the evolution of energy consumption in # the world data("worldEnergyUse") if (require(plotly)) { # Function that generates a chart representing the evolution of energy # consumption per country. Creating a function is not necessary. We do it # for clarity and reuse in the different examples. plotEnergyUse <- function(Country, Period, lwd = 2, col = "gray") { dataset <- subset( worldEnergyUse, country == Country & year >= Period[1] & year <= Period[2] ) plot_ly(dataset) %>% add_lines(~year, ~energy_used, line = list(width = lwd, color = col)) %>% layout(title = paste("Energy used in", Country)) } # Launch the interactive visualisation manipulateWidget( plotEnergyUse(Country, Period), Period = mwSlider(1960, 2014, c(1960, 2014)), Country = mwSelect(sort(unique(worldEnergyUse$country)), "United States") ) # Directly start comparison mode manipulateWidget( plotEnergyUse(Country, Period), Period = mwSlider(1960, 2014, c(1960, 2014)), Country = mwSelect(sort(unique(worldEnergyUse$country))), .compare = list(Country = c("United States", "China")), .compareOpts = compareOptions(ncol = 2) ) # Dynamic input parameters #------------------------- # The arguments of an input can depend on the values of other inputs. # In this example, when the user changes the region, the choices of input # "Country" are updated with the countries of that region. # First we create a list that contains for each region the countries in that # retion refRegions <- by(worldEnergyUse$country, worldEnergyUse$region, function(x) as.character(sort(unique(x)))) manipulateWidget( plotEnergyUse(Country, Period), Period = mwSlider(1960, 2014, c(1960, 2014)), Region = mwSelect(sort(unique(worldEnergyUse$region))), Country = mwSelect(choices = refRegions[[Region]]) ) # Grouping inputs #---------------- # Inputs can be visually grouped with function mwGroup() manipulateWidget( plotEnergyUse(Country, Period, lwd, col), Period = mwSlider(1960, 2014, c(1960, 2014)), Country = mwSelect(sort(unique(worldEnergyUse$country)), "United States"), `Graphical Parameters` = mwGroup( lwd = mwSlider(1,10, 2, label = "Line Width"), col = mwSelect(choices = c("gray", "black", "red")) ) ) # Conditional inputs #------------------- # Inputs can be displayed or hidden depending on the state of other inputs. # In this example, user can choose to display the level of aggregation # (region or country). Depending on the choixe, the application displays # input Region or input Country. plotEnergyUseRegion <- function(Region, Period, lwd = 2, col = "gray") { dataset <- subset( worldEnergyUse, region == Region & year >= Period[1] & year <= Period[2] ) dataset <- aggregate(energy_used ~ year, sum, data = dataset) plot_ly(dataset) %>% add_lines(~year, ~energy_used, line = list(width = lwd, color = col)) %>% layout(title = paste("Energy used in", Region)) } manipulateWidget( { if (Level == "Region") { plotEnergyUseRegion(Region, Period) } else { plotEnergyUse(Country, Period) } }, Period = mwSlider(1960, 2014, c(1960, 2014)), Level = mwSelect(c("Region", "Country")), Region = mwSelect(sort(unique(worldEnergyUse$region)), .display = Level == "Region"), Country = mwSelect(sort(unique(worldEnergyUse$country)), .display = Level == "Country") ) } # Advanced Usage # -------------- # When .expr is evaluated with tehnical variables: # .initial: is it the first evaluation? # .outputId: integer representing the id of the chart # .output: shiny output id # .session: shiny session # They can be used to update an already rendered widget instead of replacing # it each time an input value is modified. # # In this example, we represent on a map, the energy use of countries. # When the user changes an input, the map is not redrawn. Only the circle # markers are updated. if (require(leaflet)) { plotMap <- function(Year, MaxRadius = 30, .initial, .session, .output) { dataset <- subset(worldEnergyUse, year == Year) radius <- sqrt(dataset$energy_used) / max(sqrt(worldEnergyUse$energy_used), na.rm = TRUE) * MaxRadius if (.initial) { # map has not been rendered yet map <- leaflet() %>% addTiles() } else { # map already rendered map <- leafletProxy(.output, .session) %>% clearMarkers() } map %>% addCircleMarkers(dataset$long, dataset$lat, radius = radius, color = "gray", weight = 0, fillOpacity = 0.7) } manipulateWidget( plotMap(Year, MaxRadius, .initial, .session, .output), Year = mwSlider(1960, 2014, 2014), MaxRadius = mwSlider(10, 50, 20) ) }
# Basic example with fake data if (require(dygraphs)) { mydata <- data.frame(period = 1:100, value = rnorm(100)) manipulateWidget(dygraph(mydata[range[1]:range[2], ], main = title), range = mwSlider(1, 100, c(1, 100)), title = mwText("Fictive time series")) } # Let use manipulateWidget to explore the evolution of energy consumption in # the world data("worldEnergyUse") if (require(plotly)) { # Function that generates a chart representing the evolution of energy # consumption per country. Creating a function is not necessary. We do it # for clarity and reuse in the different examples. plotEnergyUse <- function(Country, Period, lwd = 2, col = "gray") { dataset <- subset( worldEnergyUse, country == Country & year >= Period[1] & year <= Period[2] ) plot_ly(dataset) %>% add_lines(~year, ~energy_used, line = list(width = lwd, color = col)) %>% layout(title = paste("Energy used in", Country)) } # Launch the interactive visualisation manipulateWidget( plotEnergyUse(Country, Period), Period = mwSlider(1960, 2014, c(1960, 2014)), Country = mwSelect(sort(unique(worldEnergyUse$country)), "United States") ) # Directly start comparison mode manipulateWidget( plotEnergyUse(Country, Period), Period = mwSlider(1960, 2014, c(1960, 2014)), Country = mwSelect(sort(unique(worldEnergyUse$country))), .compare = list(Country = c("United States", "China")), .compareOpts = compareOptions(ncol = 2) ) # Dynamic input parameters #------------------------- # The arguments of an input can depend on the values of other inputs. # In this example, when the user changes the region, the choices of input # "Country" are updated with the countries of that region. # First we create a list that contains for each region the countries in that # retion refRegions <- by(worldEnergyUse$country, worldEnergyUse$region, function(x) as.character(sort(unique(x)))) manipulateWidget( plotEnergyUse(Country, Period), Period = mwSlider(1960, 2014, c(1960, 2014)), Region = mwSelect(sort(unique(worldEnergyUse$region))), Country = mwSelect(choices = refRegions[[Region]]) ) # Grouping inputs #---------------- # Inputs can be visually grouped with function mwGroup() manipulateWidget( plotEnergyUse(Country, Period, lwd, col), Period = mwSlider(1960, 2014, c(1960, 2014)), Country = mwSelect(sort(unique(worldEnergyUse$country)), "United States"), `Graphical Parameters` = mwGroup( lwd = mwSlider(1,10, 2, label = "Line Width"), col = mwSelect(choices = c("gray", "black", "red")) ) ) # Conditional inputs #------------------- # Inputs can be displayed or hidden depending on the state of other inputs. # In this example, user can choose to display the level of aggregation # (region or country). Depending on the choixe, the application displays # input Region or input Country. plotEnergyUseRegion <- function(Region, Period, lwd = 2, col = "gray") { dataset <- subset( worldEnergyUse, region == Region & year >= Period[1] & year <= Period[2] ) dataset <- aggregate(energy_used ~ year, sum, data = dataset) plot_ly(dataset) %>% add_lines(~year, ~energy_used, line = list(width = lwd, color = col)) %>% layout(title = paste("Energy used in", Region)) } manipulateWidget( { if (Level == "Region") { plotEnergyUseRegion(Region, Period) } else { plotEnergyUse(Country, Period) } }, Period = mwSlider(1960, 2014, c(1960, 2014)), Level = mwSelect(c("Region", "Country")), Region = mwSelect(sort(unique(worldEnergyUse$region)), .display = Level == "Region"), Country = mwSelect(sort(unique(worldEnergyUse$country)), .display = Level == "Country") ) } # Advanced Usage # -------------- # When .expr is evaluated with tehnical variables: # .initial: is it the first evaluation? # .outputId: integer representing the id of the chart # .output: shiny output id # .session: shiny session # They can be used to update an already rendered widget instead of replacing # it each time an input value is modified. # # In this example, we represent on a map, the energy use of countries. # When the user changes an input, the map is not redrawn. Only the circle # markers are updated. if (require(leaflet)) { plotMap <- function(Year, MaxRadius = 30, .initial, .session, .output) { dataset <- subset(worldEnergyUse, year == Year) radius <- sqrt(dataset$energy_used) / max(sqrt(worldEnergyUse$energy_used), na.rm = TRUE) * MaxRadius if (.initial) { # map has not been rendered yet map <- leaflet() %>% addTiles() } else { # map already rendered map <- leafletProxy(.output, .session) %>% clearMarkers() } map %>% addCircleMarkers(dataset$long, dataset$lat, radius = radius, color = "gray", weight = 0, fillOpacity = 0.7) } manipulateWidget( plotMap(Year, MaxRadius, .initial, .session, .output), Year = mwSlider(1960, 2014, 2014), MaxRadius = mwSlider(10, 50, 20) ) }
Add a checkbox to a manipulateWidget gadget
mwCheckbox(value = FALSE, label = NULL, ..., .display = TRUE)
mwCheckbox(value = FALSE, label = NULL, ..., .display = TRUE)
value |
Initial value of the input. |
label |
Display label for the control. If |
... |
Other arguments passed to function |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckboxGroup()
,
mwDateRange()
,
mwDate()
,
mwGroup()
,
mwNumeric()
,
mwPassword()
,
mwRadio()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if(require(plotly)) { manipulateWidget( { plot_ly(iris, x = ~Sepal.Length, y = ~Sepal.Width, color = ~Species, type = "scatter", mode = "markers") %>% layout(showlegend = legend) }, legend = mwCheckbox(TRUE, "Show legend") ) }
if(require(plotly)) { manipulateWidget( { plot_ly(iris, x = ~Sepal.Length, y = ~Sepal.Width, color = ~Species, type = "scatter", mode = "markers") %>% layout(showlegend = legend) }, legend = mwCheckbox(TRUE, "Show legend") ) }
Add a group of checkboxes to a manipulateWidget gadget
mwCheckboxGroup(choices, value = c(), label = NULL, ..., .display = TRUE)
mwCheckboxGroup(choices, value = c(), label = NULL, ..., .display = TRUE)
choices |
Vector or list of choices. If it is named, then the names rather than the values are displayed to the user. |
value |
Vector containing the values initially selected |
label |
Display label for the control. If |
... |
Other arguments passed to function |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckbox()
,
mwDateRange()
,
mwDate()
,
mwGroup()
,
mwNumeric()
,
mwPassword()
,
mwRadio()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if (require(plotly)) { manipulateWidget( { if (length(species) == 0) mydata <- iris else mydata <- iris[iris$Species %in% species,] plot_ly(mydata, x = ~Sepal.Length, y = ~Sepal.Width, color = ~droplevels(Species), type = "scatter", mode = "markers") }, species = mwCheckboxGroup(levels(iris$Species)) ) }
if (require(plotly)) { manipulateWidget( { if (length(species) == 0) mydata <- iris else mydata <- iris[iris$Species %in% species,] plot_ly(mydata, x = ~Sepal.Length, y = ~Sepal.Width, color = ~droplevels(Species), type = "scatter", mode = "markers") }, species = mwCheckboxGroup(levels(iris$Species)) ) }
MWController
is a reference class that is used to manage interaction
with data and update of the view created by manipulateWidget. Only users who
desire to create automatic tests for applications created with
manipulateWidget
should care about this object.
ncharts
Number of charts in the application
nrow
Number of rows.
ncol
Number of columns.
autoUpdate
Boolean indicating if charts should be automatically
updated when a value changes. list with value
and initBtn
(not autoUpdate, if want first charts on init)
getParams(name, chartId = 1)
Get parameters of an input for a given chart
getValue(name, chartId = 1)
Get the value of a variable for a given chart.
getValues(chartId = 1)
Get all values for a given chart.
isVisible(name, chartId = 1)
Indicates if a given input is visible
returnCharts()
Return all charts.
setValue(name, value, chartId = 1, updateHTML = FALSE, reactive = FALSE)
Update the value of a variable for a given chart.
setValueAll(name, value, updateHTML = TRUE)
Update the value of an input for all charts
updateCharts()
Update all charts.
When manipulateWidget
is used in a test script, it returns a
MWController
object instead of starting a shiny gadget. This object has
methods to modify inputs values and check the state of the application. This
can be useful to automatically checks if your application behaves like desired.
Here is some sample code that uses package testthat
:
library("testthat") controller <- manipulateWidget( x + y, x = mwSlider(0, 10, 5), y = mwSlider(0, x, 0), .compare = "y" ) test_that("Two charts are created", { expect_equal(controller$ncharts, 2) }) test_that("Parameter 'max' of 'y' is updated when 'x' changes", { expect_equal(controller$getParams("y", 1)$max, 5) expect_equal(controller$getParams("y", 2)$max, 5) controller$setValue("x", 3) expect_equal(controller$getParams("y", 1)$max, 3) expect_equal(controller$getParams("y", 2)$max, 3) })
Add a date picker to a manipulateWidget gadget
mwDate(value = NULL, label = NULL, ..., .display = TRUE)
mwDate(value = NULL, label = NULL, ..., .display = TRUE)
value |
Default value of the input. |
label |
Display label for the control. If |
... |
Other arguments passed to function |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDateRange()
,
mwGroup()
,
mwNumeric()
,
mwPassword()
,
mwRadio()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if (require(dygraphs) && require(xts)) { mydata <- xts(rnorm(365), order.by = as.Date("2017-01-01") + 0:364) manipulateWidget( dygraph(mydata) %>% dyEvent(date, "Your birthday"), date = mwDate("2017-03-27", label = "Your birthday date", min = "2017-01-01", max = "2017-12-31") ) }
if (require(dygraphs) && require(xts)) { mydata <- xts(rnorm(365), order.by = as.Date("2017-01-01") + 0:364) manipulateWidget( dygraph(mydata) %>% dyEvent(date, "Your birthday"), date = mwDate("2017-03-27", label = "Your birthday date", min = "2017-01-01", max = "2017-12-31") ) }
Add a date range picker to a manipulateWidget gadget
mwDateRange( value = c(Sys.Date(), Sys.Date() + 1), label = NULL, ..., .display = TRUE )
mwDateRange( value = c(Sys.Date(), Sys.Date() + 1), label = NULL, ..., .display = TRUE )
value |
Vector containing two dates (either Date objects pr a string in yyy-mm-dd format) representing the initial date range selected. |
label |
Display label for the control. If |
... |
Other arguments passed to function |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
An Input object
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDate()
,
mwGroup()
,
mwNumeric()
,
mwPassword()
,
mwRadio()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if (require(dygraphs) && require(xts)) { mydata <- xts(rnorm(365), order.by = as.Date("2017-01-01") + 0:364) manipulateWidget( dygraph(mydata) %>% dyShading(from=period[1], to = period[2], color = "#CCEBD6"), period = mwDateRange(c("2017-03-01", "2017-04-01"), min = "2017-01-01", max = "2017-12-31") ) }
if (require(dygraphs) && require(xts)) { mydata <- xts(rnorm(365), order.by = as.Date("2017-01-01") + 0:364) manipulateWidget( dygraph(mydata) %>% dyShading(from=period[1], to = period[2], color = "#CCEBD6"), period = mwDateRange(c("2017-03-01", "2017-04-01"), min = "2017-01-01", max = "2017-12-31") ) }
This function generates a collapsible box containing inputs. It can be useful when there are a lot of inputs and one wants to group them.
mwGroup(..., label = NULL, .display = TRUE)
mwGroup(..., label = NULL, .display = TRUE)
... |
inputs that will be grouped in the box |
label |
label of the group inputs |
.display |
expression that evaluates to TRUE or FALSE, indicating when the group should be shown/hidden. |
Input of type "group".
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDateRange()
,
mwDate()
,
mwNumeric()
,
mwPassword()
,
mwRadio()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if(require(dygraphs)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget( dygraph(mydata[range[1]:range[2], ], main = title, xlab = xlab, ylab = ylab), range = mwSlider(1, 100, c(1, 100)), "Graphical parameters" = mwGroup( title = mwText("Fictive time series"), xlab = mwText("X axis label"), ylab = mwText("Y axis label") ) ) }
if(require(dygraphs)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget( dygraph(mydata[range[1]:range[2], ], main = title, xlab = xlab, ylab = ylab), range = mwSlider(1, 100, c(1, 100)), "Graphical parameters" = mwGroup( title = mwText("Fictive time series"), xlab = mwText("X axis label"), ylab = mwText("Y axis label") ) ) }
These two functions can be used to include a manipulateWidget object in a shiny application.
mwModuleUI
must be used in the UI to generate the required HTML elements and add
javascript and css dependencies. mwModule
must be called once in the server function
of the application.
mwModule(id, controller, fillPage = FALSE, ...) mwModuleUI( id, border = TRUE, okBtn = FALSE, saveBtn = TRUE, exportBtn = TRUE, updateBtn = FALSE, allowCompare = TRUE, margin = 0, width = "100%", height = 400, header = NULL, footer = NULL )
mwModule(id, controller, fillPage = FALSE, ...) mwModuleUI( id, border = TRUE, okBtn = FALSE, saveBtn = TRUE, exportBtn = TRUE, updateBtn = FALSE, allowCompare = TRUE, margin = 0, width = "100%", height = 400, header = NULL, footer = NULL )
id |
A unique string that identifies the module |
controller |
Object of class |
fillPage |
: |
... |
named arguments containing reactive values. They can be used to send data from the main shiny application to the module. |
border |
Should a border be added to the module ? |
okBtn |
Should the UI contain the OK button ? |
saveBtn |
Should the UI contain the save button ? For saving output as html |
exportBtn |
Should an export button be added to the controls ? For saving output as png |
updateBtn |
Should the updateBtn be added to the UI ? |
allowCompare |
If |
margin |
Margin to apply around the module UI. Should be one two or four valid css units. |
width |
Width of the module UI. |
height |
Height of the module UI. |
header |
Tag or list of tags to display as a common header above all tabPanels. |
footer |
Tag or list of tags to display as a common footer below all tabPanels |
mwModuleUI
returns the required HTML elements for the module. mwModule is only
used for its side effects.
if (interactive() & require("dygraphs")) { require("shiny") ui <- fillPage( fillRow( flex = c(NA, 1), div( textInput("title", label = "Title", value = "glop"), selectInput("series", "series", choices = c("series1", "series2", "series3")) ), mwModuleUI("ui", height = "100%") )) server <- function(input, output, session) { mydata <- data.frame( year = 2000+1:100, series1 = rnorm(100), series2 = rnorm(100), series3 = rnorm(100) ) c <- manipulateWidget( { dygraph(mydata[range[1]:range[2] - 2000, c("year", series)], main = title) }, range = mwSlider(2001, 2100, c(2001, 2050)), series = mwSharedValue(), title = mwSharedValue(), .runApp = FALSE, .compare = "range" ) # mwModule("ui", c, title = reactive(input$title), series = reactive(input$series)) } shinyApp(ui, server) }
if (interactive() & require("dygraphs")) { require("shiny") ui <- fillPage( fillRow( flex = c(NA, 1), div( textInput("title", label = "Title", value = "glop"), selectInput("series", "series", choices = c("series1", "series2", "series3")) ), mwModuleUI("ui", height = "100%") )) server <- function(input, output, session) { mydata <- data.frame( year = 2000+1:100, series1 = rnorm(100), series2 = rnorm(100), series3 = rnorm(100) ) c <- manipulateWidget( { dygraph(mydata[range[1]:range[2] - 2000, c("year", series)], main = title) }, range = mwSlider(2001, 2100, c(2001, 2050)), series = mwSharedValue(), title = mwSharedValue(), .runApp = FALSE, .compare = "range" ) # mwModule("ui", c, title = reactive(input$title), series = reactive(input$series)) } shinyApp(ui, server) }
Add a numeric input to a manipulateWidget gadget
mwNumeric(value, label = NULL, ..., .display = TRUE)
mwNumeric(value, label = NULL, ..., .display = TRUE)
value |
Initial value of the numeric input. |
label |
Display label for the control. If |
... |
Other arguments passed to function |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDateRange()
,
mwDate()
,
mwGroup()
,
mwPassword()
,
mwRadio()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if (require(plotly)) { manipulateWidget({ plot_ly(data.frame(x = 1:10, y = rnorm(10, mean, sd)), x=~x, y=~y, type = "scatter", mode = "markers") }, mean = mwNumeric(0), sd = mwNumeric(1, min = 0, step = 0.1) ) }
if (require(plotly)) { manipulateWidget({ plot_ly(data.frame(x = 1:10, y = rnorm(10, mean, sd)), x=~x, y=~y, type = "scatter", mode = "markers") }, mean = mwNumeric(0), sd = mwNumeric(1, min = 0, step = 0.1) ) }
Add a password to a manipulateWidget gadget
mwPassword(value = "", label = NULL, ..., .display = TRUE)
mwPassword(value = "", label = NULL, ..., .display = TRUE)
value |
Default value of the input. |
label |
Display label for the control. If |
... |
Other arguments passed to function |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDateRange()
,
mwDate()
,
mwGroup()
,
mwNumeric()
,
mwRadio()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if (require(plotly)) { manipulateWidget( { if (passwd != 'abc123') { plot_ly(type = "scatter", mode="markers") %>% layout(title = "Wrong password. True password is 'abc123'") } else { plot_ly(data.frame(x = 1:10, y = rnorm(10)), x=~x, y=~y, type = "scatter", mode = "markers") } }, user = mwText(label = "Username"), passwd = mwPassword(label = "Password") ) }
if (require(plotly)) { manipulateWidget( { if (passwd != 'abc123') { plot_ly(type = "scatter", mode="markers") %>% layout(title = "Wrong password. True password is 'abc123'") } else { plot_ly(data.frame(x = 1:10, y = rnorm(10)), x=~x, y=~y, type = "scatter", mode = "markers") } }, user = mwText(label = "Username"), passwd = mwPassword(label = "Password") ) }
Add radio buttons to a manipulateWidget gadget
mwRadio(choices, value = NULL, label = NULL, ..., .display = TRUE)
mwRadio(choices, value = NULL, label = NULL, ..., .display = TRUE)
choices |
Vector or list of choices. If it is named, then the names rather than the values are displayed to the user. |
value |
Initial value of the input. If not specified, the first choice is used. |
label |
Display label for the control. If |
... |
Other arguments passed to function |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDateRange()
,
mwDate()
,
mwGroup()
,
mwNumeric()
,
mwPassword()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if (require(plotly)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget( { mode <- switch(type, points = "markers", lines = "lines", both = "markers+lines") plot_ly(mydata, x=~x, y=~y, type = "scatter", mode = mode) }, type = mwRadio(c("points", "lines", "both")) ) }
if (require(plotly)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget( { mode <- switch(type, points = "markers", lines = "lines", both = "markers+lines") plot_ly(mydata, x=~x, y=~y, type = "scatter", mode = mode) }, type = mwRadio(c("points", "lines", "both")) ) }
Add a Select list input to a manipulateWidget gadget
mwSelect( choices = value, value = NULL, label = NULL, ..., multiple = FALSE, .display = TRUE )
mwSelect( choices = value, value = NULL, label = NULL, ..., multiple = FALSE, .display = TRUE )
choices |
Vector or list of choices. If it is named, then the names rather than the values are displayed to the user. |
value |
Initial value of the input. If not specified, the first choice is used. |
label |
Display label for the control. If |
... |
Other arguments passed to function |
multiple |
Is selection of multiple items allowed? |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDateRange()
,
mwDate()
,
mwGroup()
,
mwNumeric()
,
mwPassword()
,
mwRadio()
,
mwSelectize()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if (require(plotly)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget( { mode <- switch(type, points = "markers", lines = "lines", both = "markers+lines") plot_ly(mydata, x=~x, y=~y, type = "scatter", mode = mode) }, type = mwSelect(c("points", "lines", "both")) ) Sys.sleep(0.5) # Select multiple values manipulateWidget( { if (length(species) == 0) mydata <- iris else mydata <- iris[iris$Species %in% species,] plot_ly(mydata, x = ~Sepal.Length, y = ~Sepal.Width, color = ~droplevels(Species), type = "scatter", mode = "markers") }, species = mwSelect(levels(iris$Species), multiple = TRUE) ) }
if (require(plotly)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget( { mode <- switch(type, points = "markers", lines = "lines", both = "markers+lines") plot_ly(mydata, x=~x, y=~y, type = "scatter", mode = mode) }, type = mwSelect(c("points", "lines", "both")) ) Sys.sleep(0.5) # Select multiple values manipulateWidget( { if (length(species) == 0) mydata <- iris else mydata <- iris[iris$Species %in% species,] plot_ly(mydata, x = ~Sepal.Length, y = ~Sepal.Width, color = ~droplevels(Species), type = "scatter", mode = "markers") }, species = mwSelect(levels(iris$Species), multiple = TRUE) ) }
Add a Select list input to a manipulateWidget gadget
mwSelectize( choices = value, value = NULL, label = NULL, ..., multiple = FALSE, options = NULL, .display = TRUE )
mwSelectize( choices = value, value = NULL, label = NULL, ..., multiple = FALSE, options = NULL, .display = TRUE )
choices |
Vector or list of choices. If it is named, then the names rather than the values are displayed to the user. |
value |
Initial value of the input. If not specified, the first choice is used. |
label |
Display label for the control. If |
... |
Other arguments passed to function |
multiple |
Is selection of multiple items allowed? |
options |
A list of options. See the documentation of selectize.js for possible options |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDateRange()
,
mwDate()
,
mwGroup()
,
mwNumeric()
,
mwPassword()
,
mwRadio()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
,
mwText()
if (require(plotly)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) # Select multiple values manipulateWidget( { if (length(species) == 0) mydata <- iris else mydata <- iris[iris$Species %in% species,] plot_ly(mydata, x = ~Sepal.Length, y = ~Sepal.Width, color = ~droplevels(Species), type = "scatter", mode = "markers") }, species = mwSelectize(c("Select one or two species : " = "", levels(iris$Species)), multiple = TRUE, options = list(maxItems = 2)) ) }
if (require(plotly)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) # Select multiple values manipulateWidget( { if (length(species) == 0) mydata <- iris else mydata <- iris[iris$Species %in% species,] plot_ly(mydata, x = ~Sepal.Length, y = ~Sepal.Width, color = ~droplevels(Species), type = "scatter", mode = "markers") }, species = mwSelectize(c("Select one or two species : " = "", levels(iris$Species)), multiple = TRUE, options = list(maxItems = 2)) ) }
Add a Slider to a manipulateWidget gadget
mwSlider(min, max, value, label = NULL, ..., .display = TRUE)
mwSlider(min, max, value, label = NULL, ..., .display = TRUE)
min |
The minimum value that can be selected. |
max |
The maximum value that can be selected. |
value |
Initial value of the slider A numeric vector of length one will create a regular slider; a numeric vector of length two will create a double-ended range slider |
label |
Display label for the control. If |
... |
Other arguments passed to function |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDateRange()
,
mwDate()
,
mwGroup()
,
mwNumeric()
,
mwPassword()
,
mwRadio()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwText()
if (require(plotly)) { myWidget <- manipulateWidget( plot_ly(data.frame(x = 1:n, y = rnorm(n)), x=~x, y=~y, type = "scatter", mode = "markers"), n = mwSlider(1, 100, 10, label = "Number of values") ) Sys.sleep(0.5) # Create a double ended slider to choose a range instead of a single value mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget( plot_ly(mydata[n[1]:n[2], ], x=~x, y=~y, type = "scatter", mode = "markers"), n = mwSlider(1, 100, c(1, 10), label = "Number of values") ) }
if (require(plotly)) { myWidget <- manipulateWidget( plot_ly(data.frame(x = 1:n, y = rnorm(n)), x=~x, y=~y, type = "scatter", mode = "markers"), n = mwSlider(1, 100, 10, label = "Number of values") ) Sys.sleep(0.5) # Create a double ended slider to choose a range instead of a single value mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget( plot_ly(mydata[n[1]:n[2], ], x=~x, y=~y, type = "scatter", mode = "markers"), n = mwSlider(1, 100, c(1, 10), label = "Number of values") ) }
Add a text input to a manipulateWidget gadget
mwText(value = "", label = NULL, ..., .display = TRUE)
mwText(value = "", label = NULL, ..., .display = TRUE)
value |
Initial value of the text input. |
label |
Display label for the control. If |
... |
Other arguments passed to function |
.display |
expression that evaluates to TRUE or FALSE, indicating when the input control should be shown/hidden. |
A function that will generate the input control.
Other controls:
mwCheckboxGroup()
,
mwCheckbox()
,
mwDateRange()
,
mwDate()
,
mwGroup()
,
mwNumeric()
,
mwPassword()
,
mwRadio()
,
mwSelectize()
,
mwSelect()
,
mwSharedValue()
,
mwSlider()
if (require(plotly)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget({ plot_ly(mydata, x=~x, y=~y, type = "scatter", mode = "markers") %>% layout(title = mytitle) }, mytitle = mwText("Awesome title !") ) }
if (require(plotly)) { mydata <- data.frame(x = 1:100, y = rnorm(100)) manipulateWidget({ plot_ly(mydata, x=~x, y=~y, type = "scatter", mode = "markers") %>% layout(title = mytitle) }, mytitle = mwText("Awesome title !") ) }
Creates a list of translation strings that can be passed to function
manipulateWidget
to translate some UI elements.
mwTranslations( settings = "Settings", chart = "Chart", compare = "Compare", compareVars = "Variables to compare", ncol = "Nb Columns", ncharts = "Nb Charts" )
mwTranslations( settings = "Settings", chart = "Chart", compare = "Compare", compareVars = "Variables to compare", ncol = "Nb Columns", ncharts = "Nb Charts" )
settings |
Title of the settings panel. |
chart |
Title of the chart panel. |
compare |
Label of the checkbox that activate the comparison mode. |
compareVars |
Label of the input containing the list of variables to compare. |
ncol |
Label of the input that sets the number of columns. |
ncharts |
Label of the input that sets the number of charts. |
Named list of translation strings.
translations <- mwTranslations( settings = "Parametres", chart = "Graphique", compare = "Comparaison", compareVars = "Variable de comparaison", ncharts = "Nb graph.", ncol = "Nb col." ) if (require(dygraphs)) { mydata <- data.frame(year = 2000+1:100, value = rnorm(100)) manipulateWidget(dygraph(mydata[range[1]:range[2] - 2000, ], main = title), range = mwSlider(2001, 2100, c(2001, 2100)), title = mwText("Fictive time series"), .translations = translations) }
translations <- mwTranslations( settings = "Parametres", chart = "Graphique", compare = "Comparaison", compareVars = "Variable de comparaison", ncharts = "Nb graph.", ncol = "Nb col." ) if (require(dygraphs)) { mydata <- data.frame(year = 2000+1:100, value = rnorm(100)) manipulateWidget(dygraph(mydata[range[1]:range[2] - 2000, ], main = title), range = mwSlider(2001, 2100, c(2001, 2100)), title = mwText("Fictive time series"), .translations = translations) }
staticPlot
is a function that generates a static plot and then return
the HTML code needed to include the plot in a combinedWidgets.
staticImage
is a more general function that generates the HTML code
necessary to include any image file.
staticPlot(expr, width = 600, height = 400) staticImage(file, style = "max-width:100%%;max-height:100%%")
staticPlot(expr, width = 600, height = 400) staticImage(file, style = "max-width:100%%;max-height:100%%")
expr |
Expression that creates a static plot. |
width |
Width of the image to create. |
height |
Height of the image to create. |
file |
path of the image to include. |
style |
CSS style to apply to the image. |
a shiny.tag
object containing the HTML code required to include
the image or the plot in a combinedWidgets
object.
staticPlot(hist(rnorm(100))) if (require(plotly)) { data(iris) combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), staticPlot(hist(iris$Sepal.Length, breaks = 20), height = 300) ) # You can also embed static images in the header, footer, left or right # columns of a combinedWidgets. The advantage is that the space allocated # to the static plot will be constant when the window is resized. combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), footer = staticPlot(hist(iris$Sepal.Length, breaks = 20), height = 300) ) }
staticPlot(hist(rnorm(100))) if (require(plotly)) { data(iris) combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), staticPlot(hist(iris$Sepal.Length, breaks = 20), height = 300) ) # You can also embed static images in the header, footer, left or right # columns of a combinedWidgets. The advantage is that the space allocated # to the static plot will be constant when the window is resized. combineWidgets( plot_ly(iris, x = ~Sepal.Length, type = "histogram", nbinsx = 20), footer = staticPlot(hist(iris$Sepal.Length, breaks = 20), height = 300) ) }
summary method for MWController object
## S3 method for class 'MWController' summary(object, ...)
## S3 method for class 'MWController' summary(object, ...)
object |
MWController object |
... |
Not use |
Data.frame containing energy consumption per country from 1960 to 2014. The data comes from the World Bank website. It contains one line per couple(country, year) and has the following columns:
worldEnergyUse
worldEnergyUse
An object of class data.frame
with 9375 rows and 15 columns.
country Country name
iso2c Country code in two characters
year Year
population Population of the country
energy_used_per_capita Energy used per capita in kg of oil equivalent (EG.USE.PCAP.KG.OE)
energy_imported_prop Proportion of energy used that has been imported (EG.IMP.CONS.ZS)
energy_fossil_prop Fossil fuel energy consumption in proportion of total consumption (EG.USE.COMM.FO.ZS)
energy_used Energy consumption in kg of oil equivalent
energy_fossil Fossil fuel energy consumption in kg of oil equivalent
prop_world_energy_used Share of the country in the world energy consumption
prop_world_energy_fossil Share of the country in the world fossil energy consumption
prop_world_population Share of the country in the world population
long Longitude of the country
lat Lattitude of the country
region Region of the country
François Guillem [email protected]
https://data.worldbank.org/indicator