Compare commits

..

57 Commits

Author SHA1 Message Date
Barret Schloerke
e73e3c10f9 Debug code to see what is going on inside selectInput. Trying to set a value contained on server 2022-09-20 13:54:27 -04:00
Joe Cheng
04ad1453c1 Merge pull request #3694 from rstudio/rook-doc-link
Add link to Rook spec from docs
2022-09-07 17:38:36 -07:00
jcheng5
80eeff68ab Sync package version (GitHub Actions) 2022-09-07 14:27:51 -07:00
jcheng5
6128a3ab65 yarn build (GitHub Actions) 2022-09-07 20:43:50 +00:00
Joe Cheng
5f25537079 Add link to Rook spec from docs 2022-09-07 13:37:37 -07:00
Winston Chang
c21ba0baca Bump version to 1.7.2.9000 2022-07-19 09:18:16 -05:00
Winston Chang
ebf786c2eb Merge tag 'v1.7.2'
Shiny 1.7.2 on CRAN
2022-07-19 09:16:45 -05:00
wch
b39ffafea9 devtools::document() (GitHub Actions) 2022-07-19 00:16:11 +00:00
Winston Chang
4441945a68 Use inherits() instead of if(class(x)==y) 2022-07-18 19:11:24 -05:00
Winston Chang
cd95e058e6 Remove URL because CRAN doesn't like it 2022-07-18 19:11:24 -05:00
Winston Chang
a0144d77ef Remove broken link 2022-07-18 19:11:24 -05:00
Carson
64cec08a74 Check in most recent revdep results 2022-07-08 11:53:50 -05:00
Winston Chang
7a77b55e6a Merge branch 'main' into rc-v1.7.2 2022-07-05 20:08:10 -05:00
Winston Chang
54e5a6b43c Merge branch 'dvg-p4-fix-throttle' 2022-07-05 20:03:22 -05:00
Winston Chang
9653cc2893 Rebuild shiny.js 2022-07-05 20:01:22 -05:00
Winston Chang
47dc5b4116 Code and comment cleanup 2022-07-05 19:37:44 -05:00
dvg-p4
9db9ef527a Fixed check for isPending and rebuilt javascript 2022-07-04 10:21:22 -04:00
dvg-p4
9285a1f7fc Update srcts/src/time/throttle.ts
Based on suggestion

Co-authored-by: Winston Chang <winston@stdout.org>
2022-07-01 19:02:26 -04:00
dvg-p4
d22eb1524a Updated NEWS.md 2022-07-01 17:15:09 -04:00
dvg-p4
5e3971c776 Fixed major bug in throttle.ts 2022-07-01 16:58:41 -04:00
Carson
dbe4896102 Merge branch 'main' into rc-v1.7.2 2022-06-27 12:12:55 -05:00
Joe Cheng
ff5ef52dd5 Fix #3250 (#3602)
* Fix #3250

pruneStackTrace was interacting badly with dplyr errors. I'm still
not sure what causes these new cases, but the new behavior seems to
be much better, with no downside that I can think of.

* Fix existing unit tests

* Update news

Co-authored-by: Carson Sievert <cpsievert1@gmail.com>
2022-06-27 12:05:28 -05:00
Joe Cheng
634b1c7c3c Don't kill the session when a debounced/throttled reactive expr errors (#3624)
* Don't kill the session when a debounced/throttled reactive expr errors

Fixes #3581

* Update NEWS with PR number

Co-authored-by: Carson Sievert <cpsievert1@gmail.com>
2022-06-27 10:57:10 -05:00
Carson
1c9f8940a9 Merge branch 'main' into rc-v1.7.2 2022-06-24 17:53:49 -05:00
Carson Sievert
d4527cdc28 Use ragg::agg_png over Cairo::CairoPNG if available (#3654)
* Close #3626: use ragg::agg_png over Cairo::CairoPNG if available

* Update documentation
2022-06-24 17:50:58 -05:00
cpsievert
514206850a Sync package version (GitHub Actions) 2022-06-14 15:43:58 +00:00
cpsievert
809bc8c6de yarn build (GitHub Actions) 2022-06-14 15:42:16 +00:00
cpsievert
0d720616f3 devtools::document() (GitHub Actions) 2022-06-14 15:39:35 +00:00
Carson
0c325d422f Groom NEWS.md 2022-06-14 10:35:36 -05:00
Carson
d368aa72c3 Update URLs 2022-06-14 10:35:36 -05:00
Carson
27e1348dcb Start v1.7.2 release candidate 2022-06-14 10:35:36 -05:00
Carson Sievert
474f14003b Follow up to #3385: warn instead of message; update unit tests to reflect some parameters can now succeed when others fail (#3652) 2022-06-14 10:34:20 -05:00
Carson Sievert
8a5da25545 Fix/update news (#3651) 2022-06-14 09:18:51 -05:00
Barret Schloerke
540d68ed9f Update the _inputs_ and _values_ regular expr to support a trailing = (#3648) 2022-06-10 11:39:12 -04:00
Khaled Al-Shamaa
1ad49b153c Enable fileInput to set the capture attribute (#3481)
Co-authored-by: Barret Schloerke <barret@rstudio.com>
Co-authored-by: Barret Schloerke <schloerke@gmail.com>
Co-authored-by: Winston Chang <winston@stdout.org>
2022-06-10 10:30:34 -05:00
Winston Chang
15885cbb5f Update NEWS 2022-06-10 10:07:00 -05:00
Dean Attali
b6979d135c fix bookmarking bug #2297: don't break all bookmarking system if some URL params don't parse correctly (#3385)
Co-authored-by: Barret Schloerke <barret@rstudio.com>
2022-06-10 10:04:47 -05:00
Winston Chang
d4b19820a4 Update NEWS 2022-06-10 10:02:30 -05:00
Dieter Menne
8d529095a7 Corrected for stricter length checking in R 4.2.0 (#3625)
* Corrected for stricter length checking in R 4.2.0

* Update R/bootstrap-layout.R

Fine! I had thought of that case, but could not find that elegant solution

Co-authored-by: Carson Sievert <cpsievert1@gmail.com>

Co-authored-by: Carson Sievert <cpsievert1@gmail.com>
2022-06-10 09:59:14 -05:00
Winston Chang
77f9052ab5 Make mathjax configurable (#3650)
Co-authored-by: Neutron3529 <qweytr_1@163.com>
Co-authored-by: Joe Cheng <joe@rstudio.com>
2022-06-10 09:57:02 -05:00
Ryan Barnard
9fcc1fe8ad Fixed automatic guessing of Content-Type in downloadHandler (#3393)
* Set default downloadHandler contentType to NULL.

The change from %OR% to %||% broke automatic guessing of content type
since `NA %||% ...` evaluates to `NA`. Setting the default contentType
to NULL restores the previous behavior of automatically setting the
content type based on the file extension.

* Updated NEWS.md: downloadHandler contentType fix.

* Update NEWS.md

Co-authored-by: Winston Chang <winston@stdout.org>
Co-authored-by: Barret Schloerke <barret@rstudio.com>
2022-06-10 09:39:00 -05:00
Barret Schloerke
5d30b55372 Spelling defintion -> definition (#3649) 2022-06-09 16:52:27 -04:00
Carson Sievert
78d77ce373 insertUI() now supports execution of <script> (#3630) 2022-05-10 11:43:21 -05:00
Joe Cheng
2cae04186b Merge pull request #3628 from rstudio/joe/feature/autoreload-custom-url
Add ability for autoreload ws to be at a custom URL
2022-05-04 16:35:39 -07:00
Joe Cheng
59bddea1e9 Use external, not internal, sourcemaps for extras 2022-05-04 16:23:48 -07:00
Joe Cheng
d6bd3d9f9b Add ability for autoreload ws to be at a custom URL 2022-05-04 09:05:53 -07:00
Joe Cheng
8eb7b056f2 devmode should activate autoreload (#3620)
devmode should activate autoreload

It said it didn't, but until this commit, it appeared not to
2022-04-27 13:51:02 -07:00
Barret Schloerke
40ae9a903e Spelling (#3618) 2022-04-23 12:25:11 -04:00
Barret Schloerke
5b6c80d4b2 Update shinyAppTemplate() content to use {shinytest2} (#3599) 2022-04-22 16:10:11 -04:00
Dean Attali
fd7518018c Update internal docs: reexports.yml -> reexports.json (#3522) 2022-03-11 11:59:35 -05:00
Kathryn Doering
5c03326a8c Use HEAD for ref instead of master in runGitHub() (#3564)
Co-authored-by: Kathryn Doering <kathryn.doering@noaa.gov>
2022-02-14 15:53:33 -05:00
Barret Schloerke
2c82ee0235 Bump dev version (#3588) 2022-02-14 15:24:47 -05:00
Barret Schloerke
ac84be956a Opt-in to C collate order in test snapshots (#3515) 2022-02-14 14:12:25 -05:00
Winston Chang
0fb154cc1e Trigger input event even when there is no input binding (#3584)
Co-authored-by: Winston Chang <winston@stdout.org>
Co-authored-by: Barret Schloerke <schloerke@gmail.com>
2022-02-14 13:45:59 -05:00
Carson Sievert
837e8d33f6 Update stack trace test expectations (#3550) 2022-02-14 13:14:10 -05:00
Winston Chang
3365bfc395 Merge pull request #3583 from ismirsehregal/main 2022-02-09 17:27:18 -06:00
ismirsehregal
135fe21278 Update runapp.R
Fixed typo
2022-02-09 15:11:34 +01:00
145 changed files with 2348 additions and 14975 deletions

View File

@@ -1,7 +1,7 @@
Package: shiny
Type: Package
Title: Web Application Framework for R
Version: 1.7.1.9002
Version: 1.7.2.9000
Authors@R: c(
person("Winston", "Chang", role = c("aut", "cre"), email = "winston@rstudio.com", comment = c(ORCID = "0000-0002-1576-2126")),
person("Joe", "Cheng", role = "aut", email = "joe@rstudio.com"),
@@ -105,7 +105,6 @@ Suggests:
ggplot2,
reactlog (>= 1.0.0),
magrittr,
shinytest (>= 1.4.0.9003),
yaml,
future,
dygraphs,
@@ -202,8 +201,10 @@ Collate:
'version_selectize.R'
'version_strftime.R'
'viewer.R'
RoxygenNote: 7.1.2
RoxygenNote: 7.2.1
Encoding: UTF-8
Roxygen: list(markdown = TRUE)
RdMacros: lifecycle
Config/testthat/edition: 3
Config/Needs/check:
rstudio/shinytest2

60
NEWS.md
View File

@@ -1,21 +1,59 @@
shiny 1.7.1.9001
shiny 1.7.2.9000
================
shiny 1.7.2
===========
## Full changelog
### Minor new features and improvements
### Breaking changes
* Closed #3626: `renderPlot()` (and `plotPNG()`) now uses `ragg::agg_png()` by default when the [`{ragg}` package](https://github.com/r-lib/ragg) is installed. To restore the previous behavior, set `options(shiny.useragg = FALSE)`. (#3654)
### New features and improvements
* Closed #1545: `insertUI()` now executes `<script>` tags. (#3630)
* `fileInput()` can set the `capture` attribute to facilitates user access to a device's media capture mechanism, such as a camera, or microphone, from within a file upload control ([W3C HTML Media Capture](https://www.w3.org/TR/html-media-capture/)). (Thanks to khaled-alshamaa, #3481)
* Closed tidyverse/dplyr#5552: Compatibility of dplyr 1.0 (and rlang chained errors in general) with `req()`, `validate()`, and friends.
* Closed tidyverse/dplyr#6154: Values from an `actionButton()` had S3 classes in the incorrect order.
* Closed #3346: Default for `ref` input in `runGithub()` changed from `"master"` to `"HEAD"`. (#3564)
* Closed #3619: In R 4.2, `splitLayout()` no longer raises warnings about incorrect length in an `if` statement. (Thanks to @dmenne, #3625)
### Bug fixes
* Closed #3250:`{rlang}`/`{tidyeval}` conditions (i.e., warnings and errors) are no longer filtered from stack traces. (#3602)
* Closed #3581: Errors in throttled/debounced reactive expressions no longer cause the session to exit. (#3624)
* Closed #3657: `throttle.ts` and the `Throttler` typescript objects it provides now function as intended. (Thanks gto @dvg-p4, #3659)
* The auto-reload feature (`options(shiny.autoreload=TRUE)`) was not being activated by `devmode(TRUE)`, despite a console message asserting that it was. (#3620)
* Closed #2297: If an error occurred in parsing a value in a bookmark query string, an error would be thrown and nothing would be restored. Now a message is displayed and that value is ignored. (Thanks to @daattali, #3385)
* Restored the previous behavior of automatically guessing the `Content-Type` header for `downloadHandler` functions when no explicit `contentType` argument is supplied. (#3393)
* Previously, updating an input value without a corresponding Input binding element did not trigger a JavaScript `shiny:inputchanged` event. Now, if no Input binding element is found, the `shiny:inputchanged` event is triggered on `window.document`. (#3584)
* Closed #2955: Input and output bindings previously attempted to use `el['data-input-id']`, but that never worked. They now use `el.getAttribute('data-input-id')` instead. (#3538)
### Minor improvements
* When taking a test snapshot, the sort order of the json keys of the `input`, `output`, and `export` fields is currently sorted using the locale of the machine. This can lead to inconsistent test snapshot results. To opt-in to a consistent ordering of snapshot fields with `{shinytest}`, please set the global option `options(shiny.snapshotsortc = TRUE)`. `{shinytest2}` users do not need to set this value. (#3515)
* Closed rstudio/shinytest2#222: When restoring a context (i.e., bookmarking) from a URL, Shiny now better handles a trailing `=` after `_inputs_` and `_values_`. (#3648)
* Shiny's internal HTML dependencies are now mounted dynamically instead of statically. (#3537)
* HTML dependencies that are sent to dynamic UI now have better type checking, and no longer require a `dep.src.href` field. (#3537)
### Bug fixes
* Closed tidyverse/dplyr#5552: Compatibility of dplyr 1.0 (and rlang chained errors in general) with `req()`, `validate()`, and friends.
* Closed #2955: Input and output bindings previously attempted to use `el['data-input-id']`, but that never worked. They now use `el.getAttribute('data-input-id')` instead. (#3538)
* Closed tidyverse/dplyr#6154: Values from an `actionButton()` had S3 classes in the incorrect order.
shiny 1.7.1
===========
@@ -480,7 +518,7 @@ This is a significant release for Shiny, with a major new feature that was nearl
* Removed the (ridiculously outdated) "experimental feature" tag from the reference documentation for `renderUI`. (#2036)
* Addressed #1907: the `ignoreInit` argument was first added only to `observeEvent`. Later, we also added it to `eventReactive`, but forgot to update the documentation. Now done, thanks [@flo12392](https://github.com/flo12392)! (#2036)
* Addressed #1907: the `ignoreInit` argument was first added only to `observeEvent`. Later, we also added it to `eventReactive`, but forgot to update the documentation. Now done, thanks @flo12392! (#2036)
### Bug fixes
@@ -494,7 +532,7 @@ This is a significant release for Shiny, with a major new feature that was nearl
* Fixed #1600: URL-encoded bookmarking did not work with sliders that had dates or date-times. (#1961)
* Fixed #1962: [File dragging and dropping](https://blog.rstudio.com/2017/08/15/shiny-1-0-4/) broke in the presence of jQuery version 3.0 as introduced by the [rhandsontable](https://jrowen.github.io/rhandsontable/) [htmlwidget](https://www.htmlwidgets.org/). (#2005)
* Fixed #1962: [File dragging and dropping](https://www.rstudio.com/blog/shiny-1-0-4/) broke in the presence of jQuery version 3.0 as introduced by the [rhandsontable](https://jrowen.github.io/rhandsontable/) [htmlwidget](https://www.htmlwidgets.org/). (#2005)
* Improved the error handling inside the `addResourcePath()` function, to give end users more informative error messages when the `directoryPath` argument cannot be normalized. This is especially useful for `runtime: shiny_prerendered` Rmd documents, like `learnr` tutorials. (#1968)

View File

@@ -10,8 +10,7 @@
#' 2: app.R : Main application file
#' 3: R/example.R : Helper file with R code
#' 4: R/example-module.R : Example module
#' 5: tests/shinytest/ : Tests using the shinytest package
#' 6: tests/testthat/ : Tests using the testthat package
#' 5: tests/testthat/ : Tests using the testthat and shinytest2 package
#' ```
#'
#' If option 1 is selected, the full example application including the
@@ -24,13 +23,11 @@
#' | |- example-module.R
#' | `- example.R
#' `- tests
#' |- shinytest.R
#' |- shinytest
#' | `- mytest.R
#' |- testthat.R
#' `- testthat
#' |- test-examplemodule.R
#' |- test-server.R
#' |- test-shinytest2.R
#' `- test-sort.R
#' ```
#'
@@ -45,20 +42,20 @@
#' * `tests/` contains various tests for the application. You may
#' choose to use or remove any of them. They can be executed by the
#' [runTests()] function.
#' * `tests/shinytest.R` is a test runner for test files in the
#' `tests/shinytest/` directory.
#' * `tests/shinytest/mytest.R` is a test that uses the
#' [shinytest](https://rstudio.github.io/shinytest/) package to do
#' snapshot-based testing.
#' * `tests/testthat.R` is a test runner for test files in the
#' `tests/testthat/` directory using the [testthat](https://testthat.r-lib.org/) package.
#' `tests/testthat/` directory using the
#' [shinytest2](https://rstudio.github.io/shinytest2/reference/test_app.html)
#' package.
#' * `tests/testthat/test-examplemodule.R` is a test for an application's module server function.
#' * `tests/testthat/test-server.R` is a test for the application's server code
#' * `tests/testthat/test-shinytest2.R` is a test that uses the
#' [shinytest2](https://rstudio.github.io/shinytest2/) package to do
#' snapshot-based testing.
#' * `tests/testthat/test-sort.R` is a test for a supporting function in the `R/` directory.
#'
#' @param path Path to create new shiny application template.
#' @param examples Either one of "default", "ask", "all", or any combination of
#' "app", "rdir", "module", "shinytest", and "testthat". In an
#' "app", "rdir", "module", and "tests". In an
#' interactive session, "default" falls back to "ask"; in a non-interactive
#' session, "default" falls back to "all". With "ask", this function will
#' prompt the user to select which template items will be added to the new app
@@ -79,15 +76,19 @@ shinyAppTemplate <- function(path = NULL, examples = "default", dryrun = FALSE)
# =======================================================
choices <- c(
app = "app.R : Main application file",
rdir = "R/example.R : Helper file with R code",
module = "R/example-module.R : Example module",
shinytest = "tests/shinytest/ : Tests using the shinytest package",
testthat = "tests/testthat/ : Tests using the testthat package"
app = "app.R : Main application file",
rdir = "R/example.R : Helper file with R code",
module = "R/example-module.R : Example module",
tests = "tests/testthat/ : Tests using {testthat} and {shinytest2}"
)
# Support legacy value
examples[examples == "shinytest"] <- "tests"
examples[examples == "testthat"] <- "tests"
examples <- unique(examples)
if (identical(examples, "default")) {
if (interactive()) {
if (rlang::is_interactive()) {
examples <- "ask"
} else {
examples <- "all"
@@ -124,18 +125,8 @@ shinyAppTemplate <- function(path = NULL, examples = "default", dryrun = FALSE)
return(invisible())
}
if ("shinytest" %in% examples) {
if (!is_installed("shinytest", "1.4.0"))
{
message(
"The tests/shinytest directory needs shinytest 1.4.0 or later to work properly."
)
if (is_installed("shinytest")) {
message("You currently have shinytest ",
get_package_version("shinytest"), " installed.")
}
}
if ("tests" %in% examples) {
rlang::check_installed("shinytest2", "for {testthat} tests to work as expected")
}
# =======================================================
@@ -208,16 +199,13 @@ shinyAppTemplate <- function(path = NULL, examples = "default", dryrun = FALSE)
}
# Copy the files for a tests/ subdirectory
copy_test_dir <- function(name) {
copy_test_dir <- function() {
files <- dir(template_path("tests"), recursive = TRUE)
# Note: This is not the same as using dir(pattern = "^shinytest"), since
# that will not match files inside of shinytest/.
files <- files[grepl(paste0("^", name), files)]
# Filter out files that are not module files in the R directory.
if (! "rdir" %in% examples) {
# find all files in the testthat folder that are not module or server files
is_r_folder_file <- (!grepl("module|server", basename(files))) & (dirname(files) == "testthat")
is_r_folder_file <- !grepl("module|server|shinytest2|testthat", basename(files))
files <- files[!is_r_folder_file]
}
@@ -282,12 +270,10 @@ shinyAppTemplate <- function(path = NULL, examples = "default", dryrun = FALSE)
copy_file(file.path("R", module_files))
}
# tests/ dir
if ("shinytest" %in% examples) {
copy_test_dir("shinytest")
}
if ("testthat" %in% examples) {
copy_test_dir("testthat")
# tests/testthat dir
if ("tests" %in% examples) {
copy_test_dir()
}
invisible()
}

View File

@@ -321,34 +321,38 @@ RestoreContext <- R6Class("RestoreContext",
if (substr(queryString, 1, 1) == '?')
queryString <- substr(queryString, 2, nchar(queryString))
# The "=" after "_inputs_" is optional. Shiny doesn't generate URLs with
# "=", but httr always adds "=".
inputs_reg <- "(^|&)_inputs_=?(&|$)"
values_reg <- "(^|&)_values_=?(&|$)"
# Error if multiple '_inputs_' or '_values_'. This is needed because
# strsplit won't add an entry if the search pattern is at the end of a
# string.
if (length(gregexpr("(^|&)_inputs_(&|$)", queryString)[[1]]) > 1)
if (length(gregexpr(inputs_reg, queryString)[[1]]) > 1)
stop("Invalid state string: more than one '_inputs_' found")
if (length(gregexpr("(^|&)_values_(&|$)", queryString)[[1]]) > 1)
if (length(gregexpr(values_reg, queryString)[[1]]) > 1)
stop("Invalid state string: more than one '_values_' found")
# Look for _inputs_ and store following content in inputStr
splitStr <- strsplit(queryString, "(^|&)_inputs_(&|$)")[[1]]
splitStr <- strsplit(queryString, inputs_reg)[[1]]
if (length(splitStr) == 2) {
inputStr <- splitStr[2]
# Remove any _values_ (and content after _values_) that may come after
# _inputs_
inputStr <- strsplit(inputStr, "(^|&)_values_(&|$)")[[1]][1]
inputStr <- strsplit(inputStr, values_reg)[[1]][1]
} else {
inputStr <- ""
}
# Look for _values_ and store following content in valueStr
splitStr <- strsplit(queryString, "(^|&)_values_(&|$)")[[1]]
splitStr <- strsplit(queryString, values_reg)[[1]]
if (length(splitStr) == 2) {
valueStr <- splitStr[2]
# Remove any _inputs_ (and content after _inputs_) that may come after
# _values_
valueStr <- strsplit(valueStr, "(^|&)_inputs_(&|$)")[[1]][1]
valueStr <- strsplit(valueStr, inputs_reg)[[1]][1]
} else {
valueStr <- ""
@@ -359,16 +363,20 @@ RestoreContext <- R6Class("RestoreContext",
values <- parseQueryString(valueStr, nested = TRUE)
valuesFromJSON <- function(vals) {
mapply(names(vals), vals, SIMPLIFY = FALSE,
varsUnparsed <- c()
valsParsed <- mapply(names(vals), vals, SIMPLIFY = FALSE,
FUN = function(name, value) {
tryCatch(
safeFromJSON(value),
error = function(e) {
stop("Failed to parse URL parameter \"", name, "\"")
varsUnparsed <<- c(varsUnparsed, name)
warning("Failed to parse URL parameter \"", name, "\"")
}
)
}
)
valsParsed[varsUnparsed] <- NULL
valsParsed
}
inputs <- valuesFromJSON(inputs)

View File

@@ -6,7 +6,7 @@
#' @param sidebarPanel The [sidebarPanel] containing input controls
#' @param mainPanel The [mainPanel] containing outputs
#' @keywords internal
#' @return A UI defintion that can be passed to the [shinyUI] function
#' @return A UI definition that can be passed to the [shinyUI] function
#' @export
pageWithSidebar <- function(headerPanel,
sidebarPanel,

View File

@@ -1,4 +1,87 @@
#' @rdname bootstrapPage
#' Create a page with fluid layout
#'
#' Functions for creating fluid page layouts. A fluid page layout consists of
#' rows which in turn include columns. Rows exist for the purpose of making sure
#' their elements appear on the same line (if the browser has adequate width).
#' Columns exist for the purpose of defining how much horizontal space within a
#' 12-unit wide grid it's elements should occupy. Fluid pages scale their
#' components in realtime to fill all available browser width.
#'
#' @param ... Elements to include within the page
#' @param title The browser window title (defaults to the host URL of the page).
#' Can also be set as a side effect of the [titlePanel()] function.
#' @inheritParams bootstrapPage
#'
#' @return A UI definition that can be passed to the [shinyUI] function.
#'
#' @details To create a fluid page use the `fluidPage` function and include
#' instances of `fluidRow` and [column()] within it. As an
#' alternative to low-level row and column functions you can also use
#' higher-level layout functions like [sidebarLayout()].
#'
#' @note See the [
#' Shiny-Application-Layout-Guide](https://shiny.rstudio.com/articles/layout-guide.html) for additional details on laying out fluid
#' pages.
#'
#' @family layout functions
#' @seealso [column()]
#'
#' @examples
#' ## Only run examples in interactive R sessions
#' if (interactive()) {
#'
#' # Example of UI with fluidPage
#' ui <- fluidPage(
#'
#' # Application title
#' titlePanel("Hello Shiny!"),
#'
#' sidebarLayout(
#'
#' # Sidebar with a slider input
#' sidebarPanel(
#' sliderInput("obs",
#' "Number of observations:",
#' min = 0,
#' max = 1000,
#' value = 500)
#' ),
#'
#' # Show a plot of the generated distribution
#' mainPanel(
#' plotOutput("distPlot")
#' )
#' )
#' )
#'
#' # Server logic
#' server <- function(input, output) {
#' output$distPlot <- renderPlot({
#' hist(rnorm(input$obs))
#' })
#' }
#'
#' # Complete app with UI and server components
#' shinyApp(ui, server)
#'
#'
#' # UI demonstrating column layouts
#' ui <- fluidPage(
#' title = "Hello Shiny!",
#' fluidRow(
#' column(width = 4,
#' "4"
#' ),
#' column(width = 3, offset = 2,
#' "3 offset 2"
#' )
#' )
#' )
#'
#' shinyApp(ui, server = function(input, output) { })
#' }
#' @rdname fluidPage
#' @export
fluidPage <- function(..., title = NULL, theme = NULL, lang = NULL) {
bootstrapPage(div(class = "container-fluid", ...),
@@ -8,13 +91,62 @@ fluidPage <- function(..., title = NULL, theme = NULL, lang = NULL) {
}
#' @rdname column
#' @rdname fluidPage
#' @export
fluidRow <- function(...) {
div(class = "row", ...)
}
#' @rdname bootstrapPage
#' Create a page with a fixed layout
#'
#' Functions for creating fixed page layouts. A fixed page layout consists of
#' rows which in turn include columns. Rows exist for the purpose of making sure
#' their elements appear on the same line (if the browser has adequate width).
#' Columns exist for the purpose of defining how much horizontal space within a
#' 12-unit wide grid it's elements should occupy. Fixed pages limit their width
#' to 940 pixels on a typical display, and 724px or 1170px on smaller and larger
#' displays respectively.
#'
#' @param ... Elements to include within the container
#' @param title The browser window title (defaults to the host URL of the page)
#' @inheritParams bootstrapPage
#'
#' @return A UI definition that can be passed to the [shinyUI] function.
#'
#' @details To create a fixed page use the `fixedPage` function and include
#' instances of `fixedRow` and [column()] within it. Note that
#' unlike [fluidPage()], fixed pages cannot make use of higher-level
#' layout functions like `sidebarLayout`, rather, all layout must be done
#' with `fixedRow` and `column`.
#'
#' @note See the [
#' Shiny Application Layout Guide](https://shiny.rstudio.com/articles/layout-guide.html) for additional details on laying out fixed
#' pages.
#'
#' @family layout functions
#'
#' @seealso [column()]
#'
#' @examples
#' ## Only run examples in interactive R sessions
#' if (interactive()) {
#'
#' ui <- fixedPage(
#' title = "Hello, Shiny!",
#' fixedRow(
#' column(width = 4,
#' "4"
#' ),
#' column(width = 3, offset = 2,
#' "3 offset 2"
#' )
#' )
#' )
#'
#' shinyApp(ui, server = function(input, output) { })
#' }
#'
#' @rdname fixedPage
#' @export
fixedPage <- function(..., title = NULL, theme = NULL, lang = NULL) {
bootstrapPage(div(class = "container", ...),
@@ -23,39 +155,28 @@ fixedPage <- function(..., title = NULL, theme = NULL, lang = NULL) {
lang = lang)
}
#' @rdname column
#' @rdname fixedPage
#' @export
fixedRow <- function(...) {
div(class = "row", ...)
}
#' Responsive row-column based layout
#' Create a column within a UI definition
#'
#' Layout UI components using Bootstrap's grid layout system. Use
#' `fluidRow()` to group elements that should appear on the same line (if the
#' browser has adequate width) and `column()` to define how much horizontal
#' space within a 12-unit wide grid each on of these elements should occupy. See
#' the [layout guide](https://shiny.rstudio.com/articles/layout-guide.html) for
#' more context and examples.
#' Create a column for use within a [fluidRow()] or
#' [fixedRow()]
#'
#' To work properly, these functions need [Bootstrap](https://getbootstrap.com)
#' included on the page. Since most Shiny apps use [bootstrapPage()]
#' under-the-hood, this is usually the case, but custom page containers (i.e.,
#' [htmlTemplate()]) may need to explicitly include [bootstrapLib()]
#' dependencies.
#'
#' @param width The grid width of the column (must be between 1 and 12). When
#' the device width is small (e.g., the viewer is on a mobile phone), the
#' width is always 12. For more control over these responsive breakpoints, use
#' Bootstrap's grid system more directly (e.g., `fluidRow(div(class =
#' "col-lg-2", ...))`).
#' @param ... UI elements (i.e., [tags]). For `fluidRow()`, `...` should be a set of `column()`s.
#' @param width The grid width of the column (must be between 1 and 12)
#' @param ... Elements to include within the column
#' @param offset The number of columns to offset this column from the end of the
#' previous column.
#'
#' @return A UI element (i.e., [tags]).
#' @return A column that can be included within a
#' [fluidRow()] or [fixedRow()].
#'
#' @seealso [fluidPage()]
#'
#' @seealso [fluidRow()], [fixedRow()].
#'
#' @examples
#' ## Only run examples in interactive R sessions
@@ -81,10 +202,16 @@ fixedRow <- function(...) {
#'
#' shinyApp(ui, server)
#'
#'
#'
#' ui <- fluidPage(
#' fluidRow(
#' column(width = 4, "4"),
#' column(width = 3, offset = 2, "3 offset 2")
#' column(width = 4,
#' "4"
#' ),
#' column(width = 3, offset = 2,
#' "3 offset 2"
#' )
#' )
#' )
#' shinyApp(ui, server = function(input, output) { })
@@ -389,7 +516,7 @@ splitLayout <- function(..., cellWidths = NULL, cellArgs = list()) {
children <- children[childIdx]
count <- length(children)
if (length(cellWidths) == 0 || is.na(cellWidths)) {
if (length(cellWidths) == 0 || isTRUE(is.na(cellWidths))) {
cellWidths <- sprintf("%.3f%%", 100 / count)
}
cellWidths <- rep(cellWidths, length.out = count)

View File

@@ -1,84 +1,36 @@
#' @include utils.R
NULL
#' Create a Bootstrap UI page container
#' Create a Bootstrap page
#'
#' @description
#' Create a user interface (UI) page container based on
#' [Bootstrap](https://getbootstrap.com/)'s CSS and JavaScript. Most Shiny apps
#' should use [fluidPage()] (or [navbarPage()]) to get a page container with a
#' responsive page width, but in some cases you may want a fixed width container
#' (`fixedPage()`) or just a bare `<body>` container (`bootstrapPage()`).
#' Create a Shiny UI page that loads the CSS and JavaScript for
#' [Bootstrap](https://getbootstrap.com/), and has no content in the page
#' body (other than what you provide).
#'
#' Most Shiny apps make use of other Shiny UI functions for [managing
#' layout](https://shiny.rstudio.com/articles/layout-guide.html) (e.g.,
#' [sidebarLayout()], [fluidRow()], etc), navigation (e.g., [tabPanel()]), and
#' other styling (e.g., [wellPanel()], [inputPanel()]). A good portion of these
#' Shiny UI functions require Bootstrap to work properly (so most Shiny apps
#' should use these functions to start their UI definitions), but more advanced
#' usage (i.e., custom HTML/CSS/JS) can avoid Bootstrap entirely by using
#' [htmlTemplate()] and/or HTML [tags].
#' This function is primarily intended for users who are proficient in HTML/CSS,
#' and know how to lay out pages in Bootstrap. Most applications should use
#' [fluidPage()] along with layout functions like
#' [fluidRow()] and [sidebarLayout()].
#'
#' @param ... UI elements (i.e., [tags]).
#' @param title The browser window title (defaults to the host URL of the page).
#' Can also be set as a side effect of the [titlePanel()] function.
#' @param ... The contents of the document body.
#' @param title The browser window title (defaults to the host URL of the page)
#' @param theme One of the following:
#' * `NULL` (the default), which implies a "stock" build of Bootstrap 3.
#' * A [bslib::bs_theme()] object. This can be used to replace a stock
#' build of Bootstrap 3 with a customized version of Bootstrap 3 or higher.
#' * A character string pointing to an alternative Bootstrap stylesheet
#' (normally a css file within the www directory, e.g. `www/bootstrap.css`).
#' This option is here mainly for legacy reasons.
#' @param lang ISO 639-1 language code for the HTML page, such as "en" or "ko".
#' This will be used as the lang in the `<html>` tag, as in `<html lang="en">`.
#' This will be used as the lang in the \code{<html>} tag, as in \code{<html lang="en">}.
#' The default (NULL) results in an empty string.
#'
#' @return A UI definition (i.e., a [tags] object) that can be passed to [shinyApp()].
#' @return A UI definition that can be passed to the [shinyUI] function.
#'
#' @seealso [navbarPage()], [fillPage()], [column()], [tabPanel()]
#' @note The `basicPage` function is deprecated, you should use the
#' [fluidPage()] function instead.
#'
#' @seealso [fluidPage()], [fixedPage()]
#' @export
#' @examples
#'
#' # First create some UI content.
#' # See the layout guide to learn more about creating different layouts
#' # https://shiny.rstudio.com/articles/layout-guide.html
#' ui <- sidebarLayout(
#' sidebarPanel(sliderInput("obs", "Number of observations:", 0, 1000, 500)),
#' mainPanel(plotOutput("distPlot"))
#' )
#' server <- function(input, output) {
#' output$distPlot <- renderPlot(hist(rnorm(input$obs)))
#' }
#'
#' # Demonstrating difference between fluidPage(), fixedPage(), bootstrapPage()
#' if (interactive()) {
#' # Container width scales _fluidly_ with window size
#' shinyApp(fluidPage(ui), server)
#' # Container width changes with window size at fixed breakpoints
#' shinyApp(fixedPage(ui), server)
#' # Container width is equal to the window's width
#' shinyApp(bootstrapPage(ui), server)
#' }
#'
#' # The default look is provided by Bootstrap 3, but {bslib} can be
#' # used to customize the Bootstrap version and its default styling
#' theme <- bslib::bs_theme(
#' version = 5,
#' bg = "#101010",
#' fg = "#FDF7F7",
#' primary = "#ED79F9",
#' base_font = bslib::font_google("Prompt"),
#' code_font = bslib::font_google("JetBrains Mono")
#' )
#' if (interactive()) {
#' # Call thematic::thematic_shiny(font = "auto") to automatically
#' # translate the theme/CSS to the R plot
#' shinyApp(
#' fluidPage(ui, theme = theme, title = "Hello Bootstrap 5"),
#' server
#' )
#' }
#'
bootstrapPage <- function(..., title = NULL, theme = NULL, lang = NULL) {
args <- list(
@@ -282,12 +234,14 @@ bootstrapDependency <- function(theme) {
bootstrapVersion <- "3.4.1"
#' @rdname bootstrapPage
#' @export
basicPage <- function(...) {
bootstrapPage(div(class="container-fluid", list(...)))
}
#' Create a page that fills the window
#'
#' `fillPage` creates a page whose height and width always fill the
@@ -431,7 +385,7 @@ collapseSizes <- function(padding) {
#' @inheritParams bootstrapPage
#' @param icon Optional icon to appear on a `navbarMenu` tab.
#'
#' @return A UI defintion that can be passed to the [shinyUI] function.
#' @return A UI definition that can be passed to the [shinyUI] function.
#'
#' @details The `navbarMenu` function can be used to create an embedded
#' menu within the navbar that in turns includes additional tabPanels (see

View File

@@ -421,8 +421,17 @@ pruneStackTrace <- function(parents) {
# Loop over the parent indices. Anything that is not parented by current_node
# (a.k.a. last-known-good node), or is a dupe, can be discarded. Anything that
# is kept becomes the new current_node.
#
# jcheng 2022-03-18: Two more reasons a node can be kept:
# 1. parent is 0
# 2. parent is i
# Not sure why either of these situations happen, but they're common when
# interacting with rlang/dplyr errors. See issue rstudio/shiny#3250 for repro
# cases.
include <- vapply(seq_along(parents), function(i) {
if (!is_dupe[[i]] && parents[[i]] == current_node) {
if ((!is_dupe[[i]] && parents[[i]] == current_node) ||
parents[[i]] == 0 ||
parents[[i]] == i) {
current_node <<- i
TRUE
} else {

View File

@@ -1,19 +1,14 @@
startPNG <- function(filename, width, height, res, ...) {
# shiny.useragg is an experimental option that isn't officially supported or
# documented. It's here in the off chance that someone really wants
# to use ragg (say, instead of showtext, for custom font rendering).
# In the next shiny release, this option will likely be superseded in
# favor of a fully customizable graphics device option
if ((getOption('shiny.useragg') %||% FALSE) && is_installed("ragg")) {
pngfun <- ragg::agg_png
pngfun <- if ((getOption('shiny.useragg') %||% TRUE) && is_installed("ragg")) {
ragg::agg_png
} else if (capabilities("aqua")) {
# i.e., png(type = 'quartz')
pngfun <- grDevices::png
grDevices::png
} else if ((getOption('shiny.usecairo') %||% TRUE) && is_installed("Cairo")) {
pngfun <- Cairo::CairoPNG
Cairo::CairoPNG
} else {
# i.e., png(type = 'cairo')
pngfun <- grDevices::png
grDevices::png
}
args <- rlang::list2(filename=filename, width=width, height=height, res=res, ...)
@@ -57,33 +52,31 @@ startPNG <- function(filename, width, height, res, ...) {
grDevices::dev.cur()
}
#' Run a plotting function and save the output as a PNG
#' Capture a plot as a PNG file.
#'
#' This function returns the name of the PNG file that it generates. In
#' essence, it calls `png()`, then `func()`, then `dev.off()`.
#' So `func` must be a function that will generate a plot when used this
#' way.
#'
#' For output, it will try to use the following devices, in this order:
#' quartz (via [grDevices::png()]), then [Cairo::CairoPNG()],
#' and finally [grDevices::png()]. This is in order of quality of
#' output. Notably, plain `png` output on Linux and Windows may not
#' antialias some point shapes, resulting in poor quality output.
#'
#' In some cases, `Cairo()` provides output that looks worse than
#' `png()`. To disable Cairo output for an app, use
#' `options(shiny.usecairo=FALSE)`.
#' The PNG graphics device used is determined in the following order:
#' * If the ragg package is installed (and the `shiny.useragg` is not
#' set to `FALSE`), then use [ragg::agg_png()].
#' * If a quartz device is available (i.e., `capabilities("aqua")` is
#' `TRUE`), then use `png(type = "quartz")`.
#' * If the Cairo package is installed (and the `shiny.usecairo` option
#' is not set to `FALSE`), then use [Cairo::CairoPNG()].
#' * Otherwise, use [grDevices::png()]. In this case, Linux and Windows
#' may not antialias some point shapes, resulting in poor quality output.
#'
#' @param func A function that generates a plot.
#' @param filename The name of the output file. Defaults to a temp file with
#' extension `.png`.
#' @param width Width in pixels.
#' @param height Height in pixels.
#' @param res Resolution in pixels per inch. This value is passed to
#' [grDevices::png()]. Note that this affects the resolution of PNG rendering in
#' @param res Resolution in pixels per inch. This value is passed to the
#' graphics device. Note that this affects the resolution of PNG rendering in
#' R; it won't change the actual ppi of the browser.
#' @param ... Arguments to be passed through to [grDevices::png()].
#' These can be used to set the width, height, background color, etc.
#' @param ... Arguments to be passed through to the graphics device. These can
#' be used to set the width, height, background color, etc.
#'
#' @return A path to the newly generated PNG file.
#'
#' @export
plotPNG <- function(func, filename=tempfile(fileext='.png'),
width=400, height=400, res=72, ...) {

View File

@@ -23,7 +23,18 @@
#' @param buttonLabel The label used on the button. Can be text or an HTML tag
#' object.
#' @param placeholder The text to show before a file has been uploaded.
#' @param capture What source to use for capturing image, audio or video data.
#' This attribute facilitates user access to a device's media capture
#' mechanism, such as a camera, or microphone, from within a file upload
#' control.
#'
#' A value of `user` indicates that the user-facing camera and/or microphone
#' should be used. A value of `environment` specifies that the outward-facing
#' camera and/or microphone should be used.
#'
#' By default on most phones, this will accept still photos or video. For
#' still photos only, also use `accept="image/*"`. For video only, use
#' `accept="video/*"`.
#' @examples
#' ## Only run examples in interactive R sessions
#' if (interactive()) {
@@ -73,7 +84,8 @@
#'
#' @export
fileInput <- function(inputId, label, multiple = FALSE, accept = NULL,
width = NULL, buttonLabel = "Browse...", placeholder = "No file selected") {
width = NULL, buttonLabel = "Browse...", placeholder = "No file selected",
capture = NULL) {
restoredValue <- restoreInput(id = inputId, default = NULL)
@@ -101,6 +113,9 @@ fileInput <- function(inputId, label, multiple = FALSE, accept = NULL,
if (length(accept) > 0)
inputTag$attribs$accept <- paste(accept, collapse=',')
if (!is.null(capture)) {
inputTag$attribs$capture <- capture
}
div(class = "form-group shiny-input-container",
style = css(width = validateCssUnit(width)),

View File

@@ -2472,11 +2472,11 @@ debounce <- function(r, millis, priority = 100, domain = getDefaultReactiveDomai
# Ensure r() is called only after setting firstRun to FALSE since r()
# may throw an error
r()
try(r(), silent = TRUE)
return()
}
# This ensures r() is still tracked after firstRun
r()
try(r(), silent = TRUE)
# The value (or possibly millis) changed. Start or reset the timer.
v$when <- getDomainTimeMs(domain) + millis()
@@ -2509,7 +2509,7 @@ debounce <- function(r, millis, priority = 100, domain = getDefaultReactiveDomai
# commenting it out and studying the unit test failure that results.
primer <- observe({
primer$destroy()
er()
try(er(), silent = TRUE)
}, label = "debounce primer", domain = domain, priority = priority)
er
@@ -2551,7 +2551,7 @@ throttle <- function(r, millis, priority = 100, domain = getDefaultReactiveDomai
}
# Responsible for tracking when f() changes.
observeEvent(r(), {
observeEvent(try(r(), silent = TRUE), {
if (v$pending) {
# In a blackout period and someone already scheduled; do nothing
} else if (blackoutMillisLeft() > 0) {

View File

@@ -34,7 +34,7 @@
#' When rendering an inline plot, you must provide numeric values (in pixels)
#' to both \code{width} and \code{height}.
#' @param res Resolution of resulting plot, in pixels per inch. This value is
#' passed to [grDevices::png()]. Note that this affects the resolution of PNG
#' passed to [plotPNG()]. Note that this affects the resolution of PNG
#' rendering in R; it won't change the actual ppi of the browser.
#' @param alt Alternate text for the HTML `<img>` tag if it cannot be displayed
#' or viewed (i.e., the user uses a screen reader). In addition to a character
@@ -44,7 +44,7 @@
#' ggplot objects; for other plots, `NA` results in alt text of "Plot object".
#' `NULL` or `""` is not recommended because those should be limited to
#' decorative images.
#' @param ... Arguments to be passed through to [grDevices::png()].
#' @param ... Arguments to be passed through to [plotPNG()].
#' These can be used to set the width, height, background color, etc.
#' @inheritParams renderUI
#' @param execOnResize If `FALSE` (the default), then when a plot is

View File

@@ -121,7 +121,8 @@ runGist <- function(gist, destdir = NULL, ...) {
#' @param username GitHub username. If `repo` is of the form
#' `"username/repo"`, `username` will be taken from `repo`.
#' @param ref Desired git reference. Could be a commit, tag, or branch name.
#' Defaults to `"master"`.
#' Defaults to `"HEAD"`, which means the default branch on GitHub, typically
#' `"main"` or `"master"`.
#' @export
#' @examples
#' ## Only run this example in interactive R sessions
@@ -133,7 +134,7 @@ runGist <- function(gist, destdir = NULL, ...) {
#' runGitHub("shiny_example", "rstudio", subdir = "inst/shinyapp/")
#' }
runGitHub <- function(repo, username = getOption("github.user"),
ref = "master", subdir = NULL, destdir = NULL, ...) {
ref = "HEAD", subdir = NULL, destdir = NULL, ...) {
if (grepl('/', repo)) {
res <- strsplit(repo, '/')[[1]]

View File

@@ -28,7 +28,7 @@
#' ports will be tried.
#' @param launch.browser If true, the system's default web browser will be
#' launched automatically after the app is started. Defaults to true in
#' interactive sessions only. This value of this parameter can also be a
#' interactive sessions only. The value of this parameter can also be a
#' function to call with the application's URL.
#' @param host The IPv4 address that the application should listen on. Defaults
#' to the `shiny.host` option, if set, or `"127.0.0.1"` if not. See

View File

@@ -49,7 +49,7 @@ registerClient <- function(client) {
#' optional `session` parameter, which is used when greater control is
#' needed.
#'
#' See the [tutorial](https://rstudio.github.io/shiny/tutorial/) for more
#' See the [tutorial](https://shiny.rstudio.com/tutorial/) for more
#' on how to write a server function.
#'
#' @param func The server function for this application. See the details section
@@ -331,7 +331,7 @@ argsForServerFunc <- function(serverFunc, session) {
getEffectiveBody <- function(func) {
if (is.null(func))
NULL
else if (isS4(func) && class(func) == "functionWithTrace")
else if (isS4(func) && inherits(func, "functionWithTrace"))
body(func@original)
else
body(func)

View File

@@ -94,6 +94,10 @@ getShinyOption <- function(name, default = NULL) {
#' numbers to JSON format to send to the client web browser.}
#' \item{shiny.launch.browser (defaults to `interactive()`)}{A boolean which controls the default behavior
#' when an app is run. See [runApp()] for more information.}
#' \item{shiny.mathjax.url (defaults to `"https://mathjax.rstudio.com/latest/MathJax.js"`)}{
#' The URL that should be used to load MathJax, via [withMathJax()].}
#' \item{shiny.mathjax.config (defaults to `"config=TeX-AMS-MML_HTMLorMML"`)}{The querystring
#' used to load MathJax, via [withMathJax()].}
#' \item{shiny.maxRequestSize (defaults to 5MB)}{This is a number which specifies the maximum
#' web request size, which serves as a size limit for file uploads.}
#' \item{shiny.minified (defaults to `TRUE`)}{By default
@@ -125,6 +129,9 @@ getShinyOption <- function(name, default = NULL) {
#' console.}
#' \item{shiny.testmode (defaults to `FALSE`)}{If `TRUE`, then various features for testing Shiny
#' applications are enabled.}
#' \item{shiny.snapshotsortc (defaults to `FALSE`)}{If `TRUE`, test snapshot keys
#' for \pkg{shinytest} will be sorted consistently using the C locale. Snapshots
#' retrieved by \pkg{shinytest2} will always sort using the C locale.}
#' \item{shiny.trace (defaults to `FALSE`)}{Print messages sent between the R server and the web
#' browser client to the R console. This is useful for debugging. Possible
#' values are `"send"` (only print messages sent to the client),
@@ -133,9 +140,10 @@ getShinyOption <- function(name, default = NULL) {
#' messages).}
#' \item{shiny.autoload.r (defaults to `TRUE`)}{If `TRUE`, then the R/
#' of a shiny app will automatically be sourced.}
#' \item{shiny.usecairo (defaults to `TRUE`)}{This is used to disable graphical rendering by the
#' Cairo package, if it is installed. See [plotPNG()] for more
#' information.}
#' \item{shiny.useragg (defaults to `TRUE`)}{Set to `FALSE` to prevent PNG rendering via the
#' ragg package. See [plotPNG()] for more information.}
#' \item{shiny.usecairo (defaults to `TRUE`)}{Set to `FALSE` to prevent PNG rendering via the
#' Cairo package. See [plotPNG()] for more information.}
#' \item{shiny.devmode (defaults to `NULL`)}{Option to enable Shiny Developer Mode. When set,
#' different default `getOption(key)` values will be returned. See [devmode()] for more details.}
### Not documenting as 'shiny.devmode.verbose' is for niche use only

View File

@@ -185,9 +185,11 @@ workerId <- local({
#' session is actually connected.
#' }
#' \item{request}{
#' An environment that implements the Rook specification for HTTP requests.
#' This is the request that was used to initiate the websocket connection
#' (as opposed to the request that downloaded the web page for the app).
#' An environment that implements the [Rook
#' specification](https://github.com/jeffreyhorner/Rook#the-environment) for
#' HTTP requests. This is the request that was used to initiate the websocket
#' connection (as opposed to the request that downloaded the web page for the
#' app).
#' }
#' \item{userData}{
#' An environment for app authors and module/package authors to store whatever
@@ -478,6 +480,35 @@ ShinySession <- R6Class(
# "json" unless requested otherwise. The only other valid value is
# "rds".
format <- params$format %||% "json"
# Machines can test their snapshot under different locales.
# R CMD check runs under the `C` locale.
# However, before this parameter, existing snapshots were most likely not
# under the `C` locale is would cause failures. This parameter allows
# users to opt-in to the `C` locale.
# From ?sort:
# However, there are some caveats with the radix sort:
# If x is a character vector, all elements must share the
# same encoding. Only UTF-8 (including ASCII) and Latin-1
# encodings are supported. Collation always follows the "C"
# locale.
# {shinytest2} will always set `sortC=1`
# {shinytest} does not have `sortC` functionality.
# Users should set `options(shiny.snapshotsortc = TRUE)` within their app.
# The sortingMethod should always be `radix` going forward.
sortMethod <-
if (!is.null(params$sortC)) {
if (params$sortC != "1") {
stop("The `sortC` parameter can only be `1` or not supplied")
}
"radix"
} else {
# Allow users to set an option for {shinytest2}.
if (isTRUE(getShinyOption("snapshotsortc", default = FALSE))) {
"radix"
} else {
"auto"
}
}
values <- list()
@@ -520,7 +551,7 @@ ShinySession <- R6Class(
}
)
values$input <- sortByName(values$input)
values$input <- sortByName(values$input, method = sortMethod)
}
if (!is.null(params$output)) {
@@ -548,7 +579,7 @@ ShinySession <- R6Class(
}
)
values$output <- sortByName(values$output)
values$output <- sortByName(values$output, method = sortMethod)
}
if (!is.null(params$export)) {
@@ -569,7 +600,7 @@ ShinySession <- R6Class(
)
}
values$export <- sortByName(values$export)
values$export <- sortByName(values$export, method = sortMethod)
}
# Make sure input, output, and export are all named lists (at this
@@ -1719,7 +1750,7 @@ ShinySession <- R6Class(
},
getTestSnapshotUrl = function(input = TRUE, output = TRUE, export = TRUE,
format = "json") {
format = "json", sortC = FALSE) {
reqString <- function(group, value) {
if (isTRUE(value))
paste0(group, "=1")
@@ -1733,6 +1764,7 @@ ShinySession <- R6Class(
reqString("input", input),
reqString("output", output),
reqString("export", export),
reqString("sortC", sortC),
paste0("format=", format),
sep = "&"
)

View File

@@ -286,7 +286,7 @@ shinyAppDir_serverR <- function(appDir, options=list()) {
#
# The return value is a function that halts monitoring when called.
initAutoReloadMonitor <- function(dir) {
if (!getOption("shiny.autoreload", FALSE)) {
if (!get_devmode_option("shiny.autoreload", FALSE)) {
return(function(){})
}
@@ -339,7 +339,7 @@ initAutoReloadMonitor <- function(dir) {
#' @param appDir The application directory. If `appDir` is `NULL` or
#' not supplied, the nearest enclosing directory that is a Shiny app, starting
#' with the current directory, is used.
#' @param renv The environmeny in which the files in the `R/` directory should
#' @param renv The environment in which the files in the `R/` directory should
#' be evaluated.
#' @param globalrenv The environment in which `global.R` should be evaluated. If
#' `NULL`, `global.R` will not be evaluated at all.

View File

@@ -14,7 +14,11 @@ NULL
#' # now we can just write "static" content without withMathJax()
#' div("more math here $$\\sqrt{2}$$")
withMathJax <- function(...) {
path <- 'https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'
path <- paste0(
getOption("shiny.mathjax.url", "https://mathjax.rstudio.com/latest/MathJax.js"),
"?",
getOption("shiny.mathjax.config", "config=TeX-AMS-MML_HTMLorMML")
)
tagList(
tags$head(
singleton(tags$script(src = path, type = 'text/javascript'))

View File

@@ -778,9 +778,9 @@ renderUI <- function(expr, env = parent.frame(), quoted = FALSE,
#' function.)
#' @param contentType A string of the download's
#' [content type](https://en.wikipedia.org/wiki/Internet_media_type), for
#' example `"text/csv"` or `"image/png"`. If `NULL` or
#' `NA`, the content type will be guessed based on the filename
#' extension, or `application/octet-stream` if the extension is unknown.
#' example `"text/csv"` or `"image/png"`. If `NULL`, the content type
#' will be guessed based on the filename extension, or
#' `application/octet-stream` if the extension is unknown.
#' @param outputArgs A list of arguments to be passed through to the implicit
#' call to [downloadButton()] when `downloadHandler` is used
#' in an interactive R Markdown document.
@@ -810,7 +810,7 @@ renderUI <- function(expr, env = parent.frame(), quoted = FALSE,
#' shinyApp(ui, server)
#' }
#' @export
downloadHandler <- function(filename, content, contentType=NA, outputArgs=list()) {
downloadHandler <- function(filename, content, contentType=NULL, outputArgs=list()) {
renderFunc <- function(shinysession, name, ...) {
shinysession$registerDownload(name, filename, contentType, content)
}

View File

@@ -162,7 +162,7 @@ mergeVectors <- function(a, b) {
# Sort a vector by the names of items. If there are multiple items with the
# same name, preserve the original order of those items. For empty
# vectors/lists/NULL, return the original value.
sortByName <- function(x) {
sortByName <- function(x, method = "auto") {
if (any_unnamed(x))
stop("All items must be named")
@@ -170,7 +170,19 @@ sortByName <- function(x) {
if (length(x) == 0)
return(x)
x[order(names(x))]
# Must provide consistent sort order
# https://github.com/rstudio/shinytest/issues/409
# Using a flag in the snapshot url to determine the method
# `method="radix"` uses `C` locale, which is consistent across platforms
# Even if two platforms share `en_us.UTF-8`, they may not sort consistently
# https://blog.zhimingwang.org/macos-lc_collate-hunt
# (macOS) $ LC_ALL=en_US.UTF-8 sort <<<$'python-dev\npython3-dev'
# python-dev
# python3-dev
# (Linux) $ LC_ALL=en_US.UTF-8 sort <<<$'python-dev\npython3-dev'
# python3-dev
# python-dev
x[order(names(x), method = method)]
}
# Sort a vector. If a character vector, sort using C locale, which is consistent

View File

@@ -16,7 +16,7 @@ Easily build rich and productive interactive web apps in R &mdash; no HTML/CSS/J
* A prebuilt set of highly sophisticated, customizable, and easy-to-use widgets (e.g., plots, tables, sliders, dropdowns, date pickers, and more).
* An attractive default look based on [Bootstrap](https://getbootstrap.com/) which can also be easily customized with the [bslib](https://github.com/rstudio/bslib) package or avoided entirely with more direct R bindings to HTML/CSS/JavaScript.
* Seamless integration with [R Markdown](https://shiny.rstudio.com/articles/interactive-docs.html), making it easy to embed numerous applications natively within a larger dynamic document.
* Tools for improving and monitoring performance, including native support for [async programming](https://blog.rstudio.com/2018/06/26/shiny-1-1-0/), [caching](https://talks.cpsievert.me/20201117), [load testing](https://rstudio.github.io/shinyloadtest/), and [more](https://support.rstudio.com/hc/en-us/articles/231874748-Scaling-and-Performance-Tuning-in-RStudio-Connect).
* Tools for improving and monitoring performance, including native support for [async programming](https://www.rstudio.com/blog/shiny-1-1-0/), [caching](https://talks.cpsievert.me/20201117), [load testing](https://rstudio.github.io/shinyloadtest/), and more.
* [Modules](https://shiny.rstudio.com/articles/modules.html): a framework for reducing code duplication and complexity.
* An ability to [bookmark application state](https://shiny.rstudio.com/articles/bookmarking-state.html) and/or [generate code to reproduce output(s)](https://github.com/rstudio/shinymeta).
* A rich ecosystem of extension packages for more [custom widgets](http://www.htmlwidgets.org/), [input validation](https://github.com/rstudio/shinyvalidate), [unit testing](https://github.com/rstudio/shinytest), and more.

View File

@@ -1,2 +0,0 @@
library(shinytest)
expect_pass(testApp("../", suffix = osName()))

View File

@@ -1,12 +0,0 @@
app <- ShinyDriver$new("../../")
app$snapshotInit("mytest")
app$snapshot()
{{
if (isTRUE(module)) {
'
app$setInputs(`examplemodule1-button` = "click")
app$setInputs(`examplemodule1-button` = "click")
app$snapshot()'
}
}}

View File

@@ -1,9 +1 @@
library(testthat)
test_dir(
"./testthat",
# Run in the app's environment containing all support methods.
env = shiny::loadSupport(),
# Display the regular progress output and throw an error if any test error is found
reporter = c("progress", "fail")
)
shinytest2::test_app()

View File

@@ -14,5 +14,4 @@ if (isTRUE(rdir)) {
expect_equal(output$sequence, "1 2 3 4 5 6 7 8 9 10 11 12")
'
}
}}
})
}}})

View File

@@ -0,0 +1,18 @@
library(shinytest2)
test_that("Initial snapshot values are consistent", {
app <- AppDriver$new(name = "init")
app$expect_values()
}){{
if (isTRUE(module)) {
HTML('
test_that("Module values are consistent", {
app <- AppDriver$new(name = "mod")
app$click("examplemodule1-button")
app$click("examplemodule1-button")
app$expect_values()
})')
}
}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
/*! shiny 1.7.1.9002 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
/*! shiny 1.7.2.9000 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
#showcase-well{border-radius:0}.shiny-code{background-color:#fff;margin-bottom:0}.shiny-code code{font-family:Menlo,Consolas,"Courier New",monospace}.shiny-code-container{margin-top:20px;clear:both}.shiny-code-container h3{display:inline;margin-right:15px}.showcase-header{font-size:16px;font-weight:normal}.showcase-code-link{text-align:right;padding:15px}#showcase-app-container{vertical-align:top}#showcase-code-tabs{margin-right:15px}#showcase-code-tabs pre{border:none;line-height:1em}#showcase-code-tabs .nav{margin-bottom:0}#showcase-code-tabs ul{margin-bottom:0}#showcase-code-tabs .tab-content{border-style:solid;border-color:#e5e5e5;border-width:0px 1px 1px 1px;overflow:auto;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#showcase-app-code{width:100%}#showcase-code-position-toggle{float:right}#showcase-sxs-code{padding-top:20px;vertical-align:top}.showcase-code-license{display:block;text-align:right}#showcase-code-content pre{background-color:#fff}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,3 @@
/*! shiny 1.7.1.9002 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
/*! shiny 1.7.2.9000 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
(function(){var a=eval;window.addEventListener("message",function(i){var e=i.data;e.code&&a(e.code)});})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjdHMvc3JjL3V0aWxzL2V2YWwudHMiLCAiLi4vLi4vLi4vc3JjdHMvZXh0cmFzL3NoaW55LXRlc3Rtb2RlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvL2VzYnVpbGQuZ2l0aHViLmlvL2NvbnRlbnQtdHlwZXMvI2RpcmVjdC1ldmFsXG4vL3RsL2RyO1xuLy8gKiBEaXJlY3QgdXNhZ2Ugb2YgYGV2YWwoXCJ4XCIpYCBpcyBiYWQgd2l0aCBidW5kbGVkIGNvZGUuXG4vLyAqIEluc3RlYWQsIHVzZSBpbmRpcmVjdCBjYWxscyB0byBgZXZhbGAgc3VjaCBhcyBgaW5kaXJlY3RFdmFsKFwieFwiKWBcbi8vICAgKiBFdmVuIGp1c3QgcmVuYW1pbmcgdGhlIGZ1bmN0aW9uIHdvcmtzIHdlbGwgZW5vdWdoLlxuLy8gPiBUaGlzIGlzIGtub3duIGFzIFwiaW5kaXJlY3QgZXZhbFwiIGJlY2F1c2UgZXZhbCBpcyBub3QgYmVpbmcgY2FsbGVkIGRpcmVjdGx5LCBhbmQgc28gZG9lcyBub3QgdHJpZ2dlciB0aGUgZ3JhbW1hdGljYWwgc3BlY2lhbCBjYXNlIGZvciBkaXJlY3QgZXZhbCBpbiB0aGUgSmF2YVNjcmlwdCBWTS4gWW91IGNhbiBjYWxsIGluZGlyZWN0IGV2YWwgdXNpbmcgYW55IHN5bnRheCBhdCBhbGwgZXhjZXB0IGZvciBhbiBleHByZXNzaW9uIG9mIHRoZSBleGFjdCBmb3JtIGV2YWwoJ3gnKS4gRm9yIGV4YW1wbGUsIHZhciBldmFsMiA9IGV2YWw7IGV2YWwyKCd4JykgYW5kIFtldmFsXVswXSgneCcpIGFuZCB3aW5kb3cuZXZhbCgneCcpIGFyZSBhbGwgaW5kaXJlY3QgZXZhbCBjYWxscy5cbi8vID4gV2hlbiB5b3UgdXNlIGluZGlyZWN0IGV2YWwsIHRoZSBjb2RlIGlzIGV2YWx1YXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGluc3RlYWQgb2YgaW4gdGhlIGlubGluZSBzY29wZSBvZiB0aGUgY2FsbGVyLlxudmFyIGluZGlyZWN0RXZhbCA9IGV2YWw7XG5leHBvcnQgeyBpbmRpcmVjdEV2YWwgfTsiLCAiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9maWxlbmFtZS1jYXNlICovXG5pbXBvcnQgeyBpbmRpcmVjdEV2YWwgfSBmcm9tIFwiLi4vc3JjL3V0aWxzL2V2YWxcIjsgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHBhcmVudCBmcmFtZS4gVGhpcyBmaWxlIGlzIG9ubHkgYWRkZWQgd2hlbiB0aGVcbi8vIHNoaW55LnRlc3Rtb2RlIG9wdGlvbiBpcyBUUlVFLlxuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgdmFyIG1lc3NhZ2UgPSBlLmRhdGE7XG4gIGlmIChtZXNzYWdlLmNvZGUpIGluZGlyZWN0RXZhbChtZXNzYWdlLmNvZGUpO1xufSk7Il0sCiAgIm1hcHBpbmdzIjogIjtZQU9BLEdBQUksR0FBZSxLQ0huQixPQUFPLGlCQUFpQixVQUFXLFNBQVUsRUFBRyxDQUM5QyxHQUFJLEdBQVUsRUFBRSxLQUNoQixBQUFJLEVBQVEsTUFBTSxFQUFhLEVBQVEiLAogICJuYW1lcyI6IFtdCn0K
//# sourceMappingURL=shiny-testmode.js.map

View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": ["../../../srcts/src/utils/eval.ts", "../../../srcts/extras/shiny-testmode.ts"],
"sourcesContent": ["//esbuild.github.io/content-types/#direct-eval\n//tl/dr;\n// * Direct usage of `eval(\"x\")` is bad with bundled code.\n// * Instead, use indirect calls to `eval` such as `indirectEval(\"x\")`\n// * Even just renaming the function works well enough.\n// > This is known as \"indirect eval\" because eval is not being called directly, and so does not trigger the grammatical special case for direct eval in the JavaScript VM. You can call indirect eval using any syntax at all except for an expression of the exact form eval('x'). For example, var eval2 = eval; eval2('x') and [eval][0]('x') and window.eval('x') are all indirect eval calls.\n// > When you use indirect eval, the code is evaluated in the global scope instead of in the inline scope of the caller.\nvar indirectEval = eval;\nexport { indirectEval };", "/* eslint-disable unicorn/filename-case */\nimport { indirectEval } from \"../src/utils/eval\"; // Listen for messages from parent frame. This file is only added when the\n// shiny.testmode option is TRUE.\n\nwindow.addEventListener(\"message\", function (e) {\n var message = e.data;\n if (message.code) indirectEval(message.code);\n});"],
"mappings": ";YAOA,GAAI,GAAe,KCHnB,OAAO,iBAAiB,UAAW,SAAU,EAAG,CAC9C,GAAI,GAAU,EAAE,KAChB,AAAI,EAAQ,MAAM,EAAa,EAAQ",
"names": []
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -85,40 +85,40 @@ user. Always \code{NULL} for a \code{MockShinySesion}.}
\section{Methods}{
\subsection{Public methods}{
\itemize{
\item \href{#method-new}{\code{MockShinySession$new()}}
\item \href{#method-onFlush}{\code{MockShinySession$onFlush()}}
\item \href{#method-onFlushed}{\code{MockShinySession$onFlushed()}}
\item \href{#method-onEnded}{\code{MockShinySession$onEnded()}}
\item \href{#method-isEnded}{\code{MockShinySession$isEnded()}}
\item \href{#method-isClosed}{\code{MockShinySession$isClosed()}}
\item \href{#method-close}{\code{MockShinySession$close()}}
\item \href{#method-cycleStartAction}{\code{MockShinySession$cycleStartAction()}}
\item \href{#method-fileUrl}{\code{MockShinySession$fileUrl()}}
\item \href{#method-setInputs}{\code{MockShinySession$setInputs()}}
\item \href{#method-.scheduleTask}{\code{MockShinySession$.scheduleTask()}}
\item \href{#method-elapse}{\code{MockShinySession$elapse()}}
\item \href{#method-.now}{\code{MockShinySession$.now()}}
\item \href{#method-defineOutput}{\code{MockShinySession$defineOutput()}}
\item \href{#method-getOutput}{\code{MockShinySession$getOutput()}}
\item \href{#method-ns}{\code{MockShinySession$ns()}}
\item \href{#method-flushReact}{\code{MockShinySession$flushReact()}}
\item \href{#method-makeScope}{\code{MockShinySession$makeScope()}}
\item \href{#method-setEnv}{\code{MockShinySession$setEnv()}}
\item \href{#method-setReturned}{\code{MockShinySession$setReturned()}}
\item \href{#method-getReturned}{\code{MockShinySession$getReturned()}}
\item \href{#method-genId}{\code{MockShinySession$genId()}}
\item \href{#method-rootScope}{\code{MockShinySession$rootScope()}}
\item \href{#method-unhandledError}{\code{MockShinySession$unhandledError()}}
\item \href{#method-freezeValue}{\code{MockShinySession$freezeValue()}}
\item \href{#method-onSessionEnded}{\code{MockShinySession$onSessionEnded()}}
\item \href{#method-registerDownload}{\code{MockShinySession$registerDownload()}}
\item \href{#method-getCurrentOutputInfo}{\code{MockShinySession$getCurrentOutputInfo()}}
\item \href{#method-clone}{\code{MockShinySession$clone()}}
\item \href{#method-MockShinySession-new}{\code{MockShinySession$new()}}
\item \href{#method-MockShinySession-onFlush}{\code{MockShinySession$onFlush()}}
\item \href{#method-MockShinySession-onFlushed}{\code{MockShinySession$onFlushed()}}
\item \href{#method-MockShinySession-onEnded}{\code{MockShinySession$onEnded()}}
\item \href{#method-MockShinySession-isEnded}{\code{MockShinySession$isEnded()}}
\item \href{#method-MockShinySession-isClosed}{\code{MockShinySession$isClosed()}}
\item \href{#method-MockShinySession-close}{\code{MockShinySession$close()}}
\item \href{#method-MockShinySession-cycleStartAction}{\code{MockShinySession$cycleStartAction()}}
\item \href{#method-MockShinySession-fileUrl}{\code{MockShinySession$fileUrl()}}
\item \href{#method-MockShinySession-setInputs}{\code{MockShinySession$setInputs()}}
\item \href{#method-MockShinySession-.scheduleTask}{\code{MockShinySession$.scheduleTask()}}
\item \href{#method-MockShinySession-elapse}{\code{MockShinySession$elapse()}}
\item \href{#method-MockShinySession-.now}{\code{MockShinySession$.now()}}
\item \href{#method-MockShinySession-defineOutput}{\code{MockShinySession$defineOutput()}}
\item \href{#method-MockShinySession-getOutput}{\code{MockShinySession$getOutput()}}
\item \href{#method-MockShinySession-ns}{\code{MockShinySession$ns()}}
\item \href{#method-MockShinySession-flushReact}{\code{MockShinySession$flushReact()}}
\item \href{#method-MockShinySession-makeScope}{\code{MockShinySession$makeScope()}}
\item \href{#method-MockShinySession-setEnv}{\code{MockShinySession$setEnv()}}
\item \href{#method-MockShinySession-setReturned}{\code{MockShinySession$setReturned()}}
\item \href{#method-MockShinySession-getReturned}{\code{MockShinySession$getReturned()}}
\item \href{#method-MockShinySession-genId}{\code{MockShinySession$genId()}}
\item \href{#method-MockShinySession-rootScope}{\code{MockShinySession$rootScope()}}
\item \href{#method-MockShinySession-unhandledError}{\code{MockShinySession$unhandledError()}}
\item \href{#method-MockShinySession-freezeValue}{\code{MockShinySession$freezeValue()}}
\item \href{#method-MockShinySession-onSessionEnded}{\code{MockShinySession$onSessionEnded()}}
\item \href{#method-MockShinySession-registerDownload}{\code{MockShinySession$registerDownload()}}
\item \href{#method-MockShinySession-getCurrentOutputInfo}{\code{MockShinySession$getCurrentOutputInfo()}}
\item \href{#method-MockShinySession-clone}{\code{MockShinySession$clone()}}
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-new"></a>}}
\if{latex}{\out{\hypertarget{method-new}{}}}
\if{html}{\out{<a id="method-MockShinySession-new"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-new}{}}}
\subsection{Method \code{new()}}{
Create a new MockShinySession.
\subsection{Usage}{
@@ -127,8 +127,8 @@ Create a new MockShinySession.
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-onFlush"></a>}}
\if{latex}{\out{\hypertarget{method-onFlush}{}}}
\if{html}{\out{<a id="method-MockShinySession-onFlush"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-onFlush}{}}}
\subsection{Method \code{onFlush()}}{
Define a callback to be invoked before a reactive flush
\subsection{Usage}{
@@ -146,8 +146,8 @@ Define a callback to be invoked before a reactive flush
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-onFlushed"></a>}}
\if{latex}{\out{\hypertarget{method-onFlushed}{}}}
\if{html}{\out{<a id="method-MockShinySession-onFlushed"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-onFlushed}{}}}
\subsection{Method \code{onFlushed()}}{
Define a callback to be invoked after a reactive flush
\subsection{Usage}{
@@ -165,8 +165,8 @@ Define a callback to be invoked after a reactive flush
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-onEnded"></a>}}
\if{latex}{\out{\hypertarget{method-onEnded}{}}}
\if{html}{\out{<a id="method-MockShinySession-onEnded"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-onEnded}{}}}
\subsection{Method \code{onEnded()}}{
Define a callback to be invoked when the session ends
\subsection{Usage}{
@@ -182,8 +182,8 @@ Define a callback to be invoked when the session ends
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-isEnded"></a>}}
\if{latex}{\out{\hypertarget{method-isEnded}{}}}
\if{html}{\out{<a id="method-MockShinySession-isEnded"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-isEnded}{}}}
\subsection{Method \code{isEnded()}}{
Returns \code{FALSE} if the session has not yet been closed
\subsection{Usage}{
@@ -192,8 +192,8 @@ Returns \code{FALSE} if the session has not yet been closed
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-isClosed"></a>}}
\if{latex}{\out{\hypertarget{method-isClosed}{}}}
\if{html}{\out{<a id="method-MockShinySession-isClosed"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-isClosed}{}}}
\subsection{Method \code{isClosed()}}{
Returns \code{FALSE} if the session has not yet been closed
\subsection{Usage}{
@@ -202,8 +202,8 @@ Returns \code{FALSE} if the session has not yet been closed
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-close"></a>}}
\if{latex}{\out{\hypertarget{method-close}{}}}
\if{html}{\out{<a id="method-MockShinySession-close"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-close}{}}}
\subsection{Method \code{close()}}{
Closes the session
\subsection{Usage}{
@@ -212,8 +212,8 @@ Closes the session
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-cycleStartAction"></a>}}
\if{latex}{\out{\hypertarget{method-cycleStartAction}{}}}
\if{html}{\out{<a id="method-MockShinySession-cycleStartAction"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-cycleStartAction}{}}}
\subsection{Method \code{cycleStartAction()}}{
Unsophisticated mock implementation that merely invokes
\subsection{Usage}{
@@ -229,8 +229,8 @@ Unsophisticated mock implementation that merely invokes
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-fileUrl"></a>}}
\if{latex}{\out{\hypertarget{method-fileUrl}{}}}
\if{html}{\out{<a id="method-MockShinySession-fileUrl"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-fileUrl}{}}}
\subsection{Method \code{fileUrl()}}{
Base64-encode the given file. Needed for image rendering.
\subsection{Usage}{
@@ -250,8 +250,8 @@ Base64-encode the given file. Needed for image rendering.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-setInputs"></a>}}
\if{latex}{\out{\hypertarget{method-setInputs}{}}}
\if{html}{\out{<a id="method-MockShinySession-setInputs"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-setInputs}{}}}
\subsection{Method \code{setInputs()}}{
Sets reactive values associated with the \code{session$inputs}
object and flushes the reactives.
@@ -280,8 +280,8 @@ session$setInputs(x=1, y=2)
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-.scheduleTask"></a>}}
\if{latex}{\out{\hypertarget{method-.scheduleTask}{}}}
\if{html}{\out{<a id="method-MockShinySession-.scheduleTask"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-.scheduleTask}{}}}
\subsection{Method \code{.scheduleTask()}}{
An internal method which shouldn't be used by others.
Schedules \code{callback} for execution after some number of \code{millis}
@@ -301,8 +301,8 @@ milliseconds.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-elapse"></a>}}
\if{latex}{\out{\hypertarget{method-elapse}{}}}
\if{html}{\out{<a id="method-MockShinySession-elapse"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-elapse}{}}}
\subsection{Method \code{elapse()}}{
Simulate the passing of time by the given number of milliseconds.
\subsection{Usage}{
@@ -318,8 +318,8 @@ Simulate the passing of time by the given number of milliseconds.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-.now"></a>}}
\if{latex}{\out{\hypertarget{method-.now}{}}}
\if{html}{\out{<a id="method-MockShinySession-.now"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-.now}{}}}
\subsection{Method \code{.now()}}{
An internal method which shouldn't be used by others.
\subsection{Usage}{
@@ -331,8 +331,8 @@ Elapsed time in milliseconds.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-defineOutput"></a>}}
\if{latex}{\out{\hypertarget{method-defineOutput}{}}}
\if{html}{\out{<a id="method-MockShinySession-defineOutput"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-defineOutput}{}}}
\subsection{Method \code{defineOutput()}}{
An internal method which shouldn't be used by others.
Defines an output in a way that sets private$currentOutputName
@@ -354,8 +354,8 @@ appropriately.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-getOutput"></a>}}
\if{latex}{\out{\hypertarget{method-getOutput}{}}}
\if{html}{\out{<a id="method-MockShinySession-getOutput"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-getOutput}{}}}
\subsection{Method \code{getOutput()}}{
An internal method which shouldn't be used by others. Forces
evaluation of any reactive dependencies of the output function.
@@ -376,8 +376,8 @@ output.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-ns"></a>}}
\if{latex}{\out{\hypertarget{method-ns}{}}}
\if{html}{\out{<a id="method-MockShinySession-ns"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-ns}{}}}
\subsection{Method \code{ns()}}{
Returns the given id prefixed by this namespace's id.
\subsection{Usage}{
@@ -396,8 +396,8 @@ The id with a namespace prefix.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-flushReact"></a>}}
\if{latex}{\out{\hypertarget{method-flushReact}{}}}
\if{html}{\out{<a id="method-MockShinySession-flushReact"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-flushReact}{}}}
\subsection{Method \code{flushReact()}}{
Trigger a reactive flush right now.
\subsection{Usage}{
@@ -406,8 +406,8 @@ Trigger a reactive flush right now.
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-makeScope"></a>}}
\if{latex}{\out{\hypertarget{method-makeScope}{}}}
\if{html}{\out{<a id="method-MockShinySession-makeScope"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-makeScope}{}}}
\subsection{Method \code{makeScope()}}{
Create and return a namespace-specific session proxy.
\subsection{Usage}{
@@ -426,8 +426,8 @@ A new session proxy.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-setEnv"></a>}}
\if{latex}{\out{\hypertarget{method-setEnv}{}}}
\if{html}{\out{<a id="method-MockShinySession-setEnv"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-setEnv}{}}}
\subsection{Method \code{setEnv()}}{
Set the environment associated with a testServer() call, but
only if it has not previously been set. This ensures that only the
@@ -449,8 +449,8 @@ The provided \code{env}.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-setReturned"></a>}}
\if{latex}{\out{\hypertarget{method-setReturned}{}}}
\if{html}{\out{<a id="method-MockShinySession-setReturned"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-setReturned}{}}}
\subsection{Method \code{setReturned()}}{
Set the value returned by the module call and proactively
flush. Note that this method may be called multiple times if modules
@@ -472,8 +472,8 @@ The provided \code{value}.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-getReturned"></a>}}
\if{latex}{\out{\hypertarget{method-getReturned}{}}}
\if{html}{\out{<a id="method-MockShinySession-getReturned"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-getReturned}{}}}
\subsection{Method \code{getReturned()}}{
Get the value returned by the module call.
\subsection{Usage}{
@@ -485,8 +485,8 @@ The value returned by the module call
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-genId"></a>}}
\if{latex}{\out{\hypertarget{method-genId}{}}}
\if{html}{\out{<a id="method-MockShinySession-genId"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-genId}{}}}
\subsection{Method \code{genId()}}{
Generate a distinct character identifier for use as a proxy
namespace.
@@ -499,8 +499,8 @@ A character identifier unique to the current session.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-rootScope"></a>}}
\if{latex}{\out{\hypertarget{method-rootScope}{}}}
\if{html}{\out{<a id="method-MockShinySession-rootScope"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-rootScope}{}}}
\subsection{Method \code{rootScope()}}{
Provides a way to access the root \code{MockShinySession} from
any descendant proxy.
@@ -513,8 +513,8 @@ The root \code{MockShinySession}.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-unhandledError"></a>}}
\if{latex}{\out{\hypertarget{method-unhandledError}{}}}
\if{html}{\out{<a id="method-MockShinySession-unhandledError"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-unhandledError}{}}}
\subsection{Method \code{unhandledError()}}{
Called by observers when a reactive expression errors.
\subsection{Usage}{
@@ -530,8 +530,8 @@ Called by observers when a reactive expression errors.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-freezeValue"></a>}}
\if{latex}{\out{\hypertarget{method-freezeValue}{}}}
\if{html}{\out{<a id="method-MockShinySession-freezeValue"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-freezeValue}{}}}
\subsection{Method \code{freezeValue()}}{
Freeze a value until the flush cycle completes.
\subsection{Usage}{
@@ -549,8 +549,8 @@ Freeze a value until the flush cycle completes.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-onSessionEnded"></a>}}
\if{latex}{\out{\hypertarget{method-onSessionEnded}{}}}
\if{html}{\out{<a id="method-MockShinySession-onSessionEnded"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-onSessionEnded}{}}}
\subsection{Method \code{onSessionEnded()}}{
Registers the given callback to be invoked when the session
is closed (i.e. the connection to the client has been severed). The
@@ -570,8 +570,8 @@ guaranteed.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-registerDownload"></a>}}
\if{latex}{\out{\hypertarget{method-registerDownload}{}}}
\if{html}{\out{<a id="method-MockShinySession-registerDownload"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-registerDownload}{}}}
\subsection{Method \code{registerDownload()}}{
Associated a downloadable file with the session.
\subsection{Usage}{
@@ -598,8 +598,8 @@ function.)}
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-getCurrentOutputInfo"></a>}}
\if{latex}{\out{\hypertarget{method-getCurrentOutputInfo}{}}}
\if{html}{\out{<a id="method-MockShinySession-getCurrentOutputInfo"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-getCurrentOutputInfo}{}}}
\subsection{Method \code{getCurrentOutputInfo()}}{
Get information about the output that is currently being
executed.
@@ -614,8 +614,8 @@ output, or \code{NULL} if no output is currently executing.
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-clone"></a>}}
\if{latex}{\out{\hypertarget{method-clone}{}}}
\if{html}{\out{<a id="method-MockShinySession-clone"></a>}}
\if{latex}{\out{\hypertarget{method-MockShinySession-clone}{}}}
\subsection{Method \code{clone()}}{
The objects of this class are cloneable with this method.
\subsection{Usage}{

View File

@@ -62,19 +62,19 @@ shinyApp(ui, server)
\section{Methods}{
\subsection{Public methods}{
\itemize{
\item \href{#method-new}{\code{Progress$new()}}
\item \href{#method-set}{\code{Progress$set()}}
\item \href{#method-inc}{\code{Progress$inc()}}
\item \href{#method-getMin}{\code{Progress$getMin()}}
\item \href{#method-getMax}{\code{Progress$getMax()}}
\item \href{#method-getValue}{\code{Progress$getValue()}}
\item \href{#method-close}{\code{Progress$close()}}
\item \href{#method-clone}{\code{Progress$clone()}}
\item \href{#method-Progress-new}{\code{Progress$new()}}
\item \href{#method-Progress-set}{\code{Progress$set()}}
\item \href{#method-Progress-inc}{\code{Progress$inc()}}
\item \href{#method-Progress-getMin}{\code{Progress$getMin()}}
\item \href{#method-Progress-getMax}{\code{Progress$getMax()}}
\item \href{#method-Progress-getValue}{\code{Progress$getValue()}}
\item \href{#method-Progress-close}{\code{Progress$close()}}
\item \href{#method-Progress-clone}{\code{Progress$clone()}}
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-new"></a>}}
\if{latex}{\out{\hypertarget{method-new}{}}}
\if{html}{\out{<a id="method-Progress-new"></a>}}
\if{latex}{\out{\hypertarget{method-Progress-new}{}}}
\subsection{Method \code{new()}}{
Creates a new progress panel (but does not display it).
\subsection{Usage}{
@@ -107,8 +107,8 @@ is for backward-compatibility).}
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-set"></a>}}
\if{latex}{\out{\hypertarget{method-set}{}}}
\if{html}{\out{<a id="method-Progress-set"></a>}}
\if{latex}{\out{\hypertarget{method-Progress-set}{}}}
\subsection{Method \code{set()}}{
Updates the progress panel. When called the first time, the
progress panel is displayed.
@@ -135,8 +135,8 @@ relative to \code{message}.}
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-inc"></a>}}
\if{latex}{\out{\hypertarget{method-inc}{}}}
\if{html}{\out{<a id="method-Progress-inc"></a>}}
\if{latex}{\out{\hypertarget{method-Progress-inc}{}}}
\subsection{Method \code{inc()}}{
Like \code{set}, this updates the progress panel. The difference
is that \code{inc} increases the progress bar by \code{amount}, instead of
@@ -163,8 +163,8 @@ relative to \code{message}.}
}
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-getMin"></a>}}
\if{latex}{\out{\hypertarget{method-getMin}{}}}
\if{html}{\out{<a id="method-Progress-getMin"></a>}}
\if{latex}{\out{\hypertarget{method-Progress-getMin}{}}}
\subsection{Method \code{getMin()}}{
Returns the minimum value.
\subsection{Usage}{
@@ -173,8 +173,8 @@ Returns the minimum value.
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-getMax"></a>}}
\if{latex}{\out{\hypertarget{method-getMax}{}}}
\if{html}{\out{<a id="method-Progress-getMax"></a>}}
\if{latex}{\out{\hypertarget{method-Progress-getMax}{}}}
\subsection{Method \code{getMax()}}{
Returns the maximum value.
\subsection{Usage}{
@@ -183,8 +183,8 @@ Returns the maximum value.
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-getValue"></a>}}
\if{latex}{\out{\hypertarget{method-getValue}{}}}
\if{html}{\out{<a id="method-Progress-getValue"></a>}}
\if{latex}{\out{\hypertarget{method-Progress-getValue}{}}}
\subsection{Method \code{getValue()}}{
Returns the current value.
\subsection{Usage}{
@@ -193,8 +193,8 @@ Returns the current value.
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-close"></a>}}
\if{latex}{\out{\hypertarget{method-close}{}}}
\if{html}{\out{<a id="method-Progress-close"></a>}}
\if{latex}{\out{\hypertarget{method-Progress-close}{}}}
\subsection{Method \code{close()}}{
Removes the progress panel. Future calls to \code{set} and
\code{close} will be ignored.
@@ -204,8 +204,8 @@ Removes the progress panel. Future calls to \code{set} and
}
\if{html}{\out{<hr>}}
\if{html}{\out{<a id="method-clone"></a>}}
\if{latex}{\out{\hypertarget{method-clone}{}}}
\if{html}{\out{<a id="method-Progress-clone"></a>}}
\if{latex}{\out{\hypertarget{method-Progress-clone}{}}}
\subsection{Method \code{clone()}}{
The objects of this class are cloneable with this method.
\subsection{Usage}{

View File

@@ -40,7 +40,9 @@ sense, namely:
In the example here, the \code{bindCache()} key consists of \code{input$x} and
\code{input$y} combined, and the value is \code{input$x * input$y}. In this simple
example, for any given key, there is only one possible returned value.\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- reactive(\{ input$x * input$y \}) \%>\%
example, for any given key, there is only one possible returned value.
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- reactive(\{ input$x * input$y \}) \%>\%
bindCache(input$x, input$y)
}\if{html}{\out{</div>}}
@@ -63,7 +65,9 @@ to do some sort of reduction on the data that still captures information
about whether a value can be retrieved from the cache. For example, if you
have a large data set with timestamps, it might make sense to extract the
most recent timestamp and return that. Then, instead of hashing the entire
data object, the cached reactive only needs to hash the timestamp.\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- reactive(\{ compute(bigdata()) \} \%>\%
data object, the cached reactive only needs to hash the timestamp.
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- reactive(\{ compute(bigdata()) \} \%>\%
bindCache(\{ extract_most_recent_time(bigdata()) \})
}\if{html}{\out{</div>}}
@@ -105,7 +109,9 @@ cache key is not too expensive.
Remember that the key is \emph{reactive}, so it is not re-executed every single
time that someone accesses the cached reactive. It is only re-executed if
it has been invalidated by one of the reactives it depends on. For
example, suppose we have this cached reactive:\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- reactive(\{ input$x * input$y \}) \%>\%
example, suppose we have this cached reactive:
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- reactive(\{ input$x * input$y \}) \%>\%
bindCache(input$x, input$y)
}\if{html}{\out{</div>}}
@@ -154,24 +160,30 @@ persists beyond the current R session.
To use different settings for an application-scoped cache, you can call
\code{\link[=shinyOptions]{shinyOptions()}} at the top of your app.R, server.R, or
global.R. For example, this will create a cache with 500 MB of space
instead of the default 200 MB:\preformatted{shinyOptions(cache = cachem::cache_mem(max_size = 500e6))
}
instead of the default 200 MB:
\if{html}{\out{<div class="sourceCode">}}\preformatted{shinyOptions(cache = cachem::cache_mem(max_size = 500e6))
}\if{html}{\out{</div>}}
To use different settings for a session-scoped cache, you can set
\code{self$cache} at the top of your server function. By default, it will create
a 200 MB memory cache for each session, but you can replace it with
something different. To use the session-scoped cache, you must also call
\code{bindCache()} with \code{cache="session"}. This will create a 100 MB cache for
the session:\preformatted{function(input, output, session) \{
the session:
\if{html}{\out{<div class="sourceCode">}}\preformatted{function(input, output, session) \{
session$cache <- cachem::cache_mem(max_size = 100e6)
...
\}
}
}\if{html}{\out{</div>}}
If you want to use a cache that is shared across multiple R processes, you
can use a \code{\link[cachem:cache_disk]{cachem::cache_disk()}}. You can create a application-level shared
cache by putting this at the top of your app.R, server.R, or global.R:\preformatted{shinyOptions(cache = cachem::cache_disk(file.path(dirname(tempdir()), "myapp-cache"))
}
cache by putting this at the top of your app.R, server.R, or global.R:
\if{html}{\out{<div class="sourceCode">}}\preformatted{shinyOptions(cache = cachem::cache_disk(file.path(dirname(tempdir()), "myapp-cache"))
}\if{html}{\out{</div>}}
This will create a subdirectory in your system temp directory named
\code{myapp-cache} (replace \code{myapp-cache} with a unique name of
@@ -181,8 +193,10 @@ stops of the R process, as long as you do not reboot.
To have the cache persist even across multiple reboots, you can create the
cache in a location outside of the temp directory. For example, it could
be a subdirectory of the application:\preformatted{shinyOptions(cache = cachem::cache_disk("./myapp-cache"))
}
be a subdirectory of the application:
\if{html}{\out{<div class="sourceCode">}}\preformatted{shinyOptions(cache = cachem::cache_disk("./myapp-cache"))
}\if{html}{\out{</div>}}
In this case, resetting the cache will have to be done manually, by deleting
the directory.
@@ -247,9 +261,11 @@ You may need to provide a \code{cacheHint} to \code{\link[=createRenderFunction]
\code{htmlwidgets::shinyRenderWidget()}, if you've authored an htmlwidget) in
order for \code{bindCache()} to correctly compute a cache key.
The potential problem is a cache collision. Consider the following:\preformatted{output$x1 <- renderText(\{ input$x \}) \%>\% bindCache(input$x)
The potential problem is a cache collision. Consider the following:
\if{html}{\out{<div class="sourceCode">}}\preformatted{output$x1 <- renderText(\{ input$x \}) \%>\% bindCache(input$x)
output$x2 <- renderText(\{ input$x * 2 \}) \%>\% bindCache(input$x)
}
}\if{html}{\out{</div>}}
Both \code{output$x1} and \code{output$x2} use \code{input$x} as part of their cache key,
but if it were the only thing used in the cache key, then the two outputs
@@ -258,7 +274,9 @@ this, a \emph{cache hint} is automatically added when \code{\link[=renderText]{r
\code{\link[=createRenderFunction]{createRenderFunction()}}. The cache hint is used as part of the actual
cache key, in addition to the one passed to \code{bindCache()} by the user. The
cache hint can be viewed by calling the internal Shiny function
\code{extractCacheHint()}:\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- renderText(\{ input$x \})
\code{extractCacheHint()}:
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- renderText(\{ input$x \})
shiny:::extractCacheHint(r)
}\if{html}{\out{</div>}}
@@ -289,7 +307,9 @@ that may influence the final value.
For \pkg{htmlwidgets}, it will try to automatically infer a cache hint;
again, you can inspect the cache hint with \code{shiny:::extractCacheHint()} and
also test it in an application. If you do need to explicitly provide a
cache hint, pass it to \code{shinyRenderWidget}. For example:\preformatted{renderMyWidget <- function(expr) \{
cache hint, pass it to \code{shinyRenderWidget}. For example:
\if{html}{\out{<div class="sourceCode">}}\preformatted{renderMyWidget <- function(expr) \{
q <- rlang::enquo0(expr)
htmlwidgets::shinyRenderWidget(
@@ -299,7 +319,7 @@ cache hint, pass it to \code{shinyRenderWidget}. For example:\preformatted{rende
cacheHint = list(label = "myWidget", userQuo = q)
)
\}
}
}\if{html}{\out{</div>}}
If your \code{render} function sets any internal state, you may find it useful
in your call to \code{\link[=createRenderFunction]{createRenderFunction()}} to use
@@ -330,8 +350,10 @@ For developers of such code, they should call \code{\link[=createRenderFunction]
When \code{bindCache()} is used with \code{renderPlot()}, the \code{height} and \code{width}
passed to the original \code{renderPlot()} are ignored. They are superseded by
\code{sizePolicy} argument passed to `bindCache. The default is:\preformatted{sizePolicy = sizeGrowthRatio(width = 400, height = 400, growthRate = 1.2)
}
\code{sizePolicy} argument passed to `bindCache. The default is:
\if{html}{\out{<div class="sourceCode">}}\preformatted{sizePolicy = sizeGrowthRatio(width = 400, height = 400, growthRate = 1.2)
}\if{html}{\out{</div>}}
\code{sizePolicy} must be a function that takes a two-element numeric vector as
input, representing the width and height of the \verb{<img>} element in the

View File

@@ -171,7 +171,9 @@ user sets both \code{x} and \code{y}, and then clicks on an \link{actionButton}
\code{go}.
To use both caching and events, the object should first be passed to
\code{bindCache()}, then \code{bindEvent()}. For example:\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- reactive(\{
\code{bindCache()}, then \code{bindEvent()}. For example:
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- reactive(\{
Sys.sleep(2) # Pretend this is an expensive computation
input$x * input$y
\}) \%>\%

View File

@@ -14,7 +14,6 @@ bootstrapLib(theme = NULL)
build of Bootstrap 3 with a customized version of Bootstrap 3 or higher.
\item A character string pointing to an alternative Bootstrap stylesheet
(normally a css file within the www directory, e.g. \code{www/bootstrap.css}).
This option is here mainly for legacy reasons.
}}
}
\description{

View File

@@ -1,25 +1,18 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/bootstrap-layout.R, R/bootstrap.R
\name{fluidPage}
\alias{fluidPage}
\alias{fixedPage}
% Please edit documentation in R/bootstrap.R
\name{bootstrapPage}
\alias{bootstrapPage}
\alias{basicPage}
\title{Create a Bootstrap UI page container}
\title{Create a Bootstrap page}
\usage{
fluidPage(..., title = NULL, theme = NULL, lang = NULL)
fixedPage(..., title = NULL, theme = NULL, lang = NULL)
bootstrapPage(..., title = NULL, theme = NULL, lang = NULL)
basicPage(...)
}
\arguments{
\item{...}{UI elements (i.e., \link{tags}).}
\item{...}{The contents of the document body.}
\item{title}{The browser window title (defaults to the host URL of the page).
Can also be set as a side effect of the \code{\link[=titlePanel]{titlePanel()}} function.}
\item{title}{The browser window title (defaults to the host URL of the page)}
\item{theme}{One of the following:
\itemize{
@@ -28,74 +21,30 @@ Can also be set as a side effect of the \code{\link[=titlePanel]{titlePanel()}}
build of Bootstrap 3 with a customized version of Bootstrap 3 or higher.
\item A character string pointing to an alternative Bootstrap stylesheet
(normally a css file within the www directory, e.g. \code{www/bootstrap.css}).
This option is here mainly for legacy reasons.
}}
\item{lang}{ISO 639-1 language code for the HTML page, such as "en" or "ko".
This will be used as the lang in the \verb{<html>} tag, as in \verb{<html lang="en">}.
This will be used as the lang in the \code{<html>} tag, as in \code{<html lang="en">}.
The default (NULL) results in an empty string.}
}
\value{
A UI definition (i.e., a \link{tags} object) that can be passed to \code{\link[=shinyApp]{shinyApp()}}.
A UI definition that can be passed to the \link{shinyUI} function.
}
\description{
Create a user interface (UI) page container based on
\href{https://getbootstrap.com/}{Bootstrap}'s CSS and JavaScript. Most Shiny apps
should use \code{\link[=fluidPage]{fluidPage()}} (or \code{\link[=navbarPage]{navbarPage()}}) to get a page container with a
responsive page width, but in some cases you may want a fixed width container
(\code{fixedPage()}) or just a bare \verb{<body>} container (\code{bootstrapPage()}).
Most Shiny apps make use of other Shiny UI functions for \href{https://shiny.rstudio.com/articles/layout-guide.html}{managing layout} (e.g.,
\code{\link[=sidebarLayout]{sidebarLayout()}}, \code{\link[=fluidRow]{fluidRow()}}, etc), navigation (e.g., \code{\link[=tabPanel]{tabPanel()}}), and
other styling (e.g., \code{\link[=wellPanel]{wellPanel()}}, \code{\link[=inputPanel]{inputPanel()}}). A good portion of these
Shiny UI functions require Bootstrap to work properly (so most Shiny apps
should use these functions to start their UI definitions), but more advanced
usage (i.e., custom HTML/CSS/JS) can avoid Bootstrap entirely by using
\code{\link[=htmlTemplate]{htmlTemplate()}} and/or HTML \link{tags}.
Create a Shiny UI page that loads the CSS and JavaScript for
\href{https://getbootstrap.com/}{Bootstrap}, and has no content in the page
body (other than what you provide).
}
\examples{
# First create some UI content.
# See the layout guide to learn more about creating different layouts
# https://shiny.rstudio.com/articles/layout-guide.html
ui <- sidebarLayout(
sidebarPanel(sliderInput("obs", "Number of observations:", 0, 1000, 500)),
mainPanel(plotOutput("distPlot"))
)
server <- function(input, output) {
output$distPlot <- renderPlot(hist(rnorm(input$obs)))
\details{
This function is primarily intended for users who are proficient in HTML/CSS,
and know how to lay out pages in Bootstrap. Most applications should use
\code{\link[=fluidPage]{fluidPage()}} along with layout functions like
\code{\link[=fluidRow]{fluidRow()}} and \code{\link[=sidebarLayout]{sidebarLayout()}}.
}
# Demonstrating difference between fluidPage(), fixedPage(), bootstrapPage()
if (interactive()) {
# Container width scales _fluidly_ with window size
shinyApp(fluidPage(ui), server)
# Container width changes with window size at fixed breakpoints
shinyApp(fixedPage(ui), server)
# Container width is equal to the window's width
shinyApp(bootstrapPage(ui), server)
}
# The default look is provided by Bootstrap 3, but {bslib} can be
# used to customize the Bootstrap version and its default styling
theme <- bslib::bs_theme(
version = 5,
bg = "#101010",
fg = "#FDF7F7",
primary = "#ED79F9",
base_font = bslib::font_google("Prompt"),
code_font = bslib::font_google("JetBrains Mono")
)
if (interactive()) {
# Call thematic::thematic_shiny(font = "auto") to automatically
# translate the theme/CSS to the R plot
shinyApp(
fluidPage(ui, theme = theme, title = "Hello Bootstrap 5"),
server
)
}
\note{
The \code{basicPage} function is deprecated, you should use the
\code{\link[=fluidPage]{fluidPage()}} function instead.
}
\seealso{
\code{\link[=navbarPage]{navbarPage()}}, \code{\link[=fillPage]{fillPage()}}, \code{\link[=column]{column()}}, \code{\link[=tabPanel]{tabPanel()}}
\code{\link[=fluidPage]{fluidPage()}}, \code{\link[=fixedPage]{fixedPage()}}
}

View File

@@ -1,45 +1,26 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/bootstrap-layout.R
\name{fluidRow}
\alias{fluidRow}
\alias{fixedRow}
\name{column}
\alias{column}
\title{Responsive row-column based layout}
\title{Create a column within a UI definition}
\usage{
fluidRow(...)
fixedRow(...)
column(width, ..., offset = 0)
}
\arguments{
\item{...}{UI elements (i.e., \link{tags}). For \code{fluidRow()}, \code{...} should be a set of \code{column()}s.}
\item{width}{The grid width of the column (must be between 1 and 12)}
\item{width}{The grid width of the column (must be between 1 and 12). When
the device width is small (e.g., the viewer is on a mobile phone), the
width is always 12. For more control over these responsive breakpoints, use
Bootstrap's grid system more directly (e.g., \code{fluidRow(div(class = "col-lg-2", ...))}).}
\item{...}{Elements to include within the column}
\item{offset}{The number of columns to offset this column from the end of the
previous column.}
}
\value{
A UI element (i.e., \link{tags}).
A column that can be included within a
\code{\link[=fluidRow]{fluidRow()}} or \code{\link[=fixedRow]{fixedRow()}}.
}
\description{
Layout UI components using Bootstrap's grid layout system. Use
\code{fluidRow()} to group elements that should appear on the same line (if the
browser has adequate width) and \code{column()} to define how much horizontal
space within a 12-unit wide grid each on of these elements should occupy. See
the \href{https://shiny.rstudio.com/articles/layout-guide.html}{layout guide} for
more context and examples.
}
\details{
To work properly, these functions need \href{https://getbootstrap.com}{Bootstrap}
included on the page. Since most Shiny apps use \code{\link[=bootstrapPage]{bootstrapPage()}}
under-the-hood, this is usually the case, but custom page containers (i.e.,
\code{\link[=htmlTemplate]{htmlTemplate()}}) may need to explicitly include \code{\link[=bootstrapLib]{bootstrapLib()}}
dependencies.
Create a column for use within a \code{\link[=fluidRow]{fluidRow()}} or
\code{\link[=fixedRow]{fixedRow()}}
}
\examples{
## Only run examples in interactive R sessions
@@ -65,15 +46,21 @@ server <- function(input, output) {
shinyApp(ui, server)
ui <- fluidPage(
fluidRow(
column(width = 4, "4"),
column(width = 3, offset = 2, "3 offset 2")
column(width = 4,
"4"
),
column(width = 3, offset = 2,
"3 offset 2"
)
)
)
shinyApp(ui, server = function(input, output) { })
}
}
\seealso{
\code{\link[=fluidPage]{fluidPage()}}
\code{\link[=fluidRow]{fluidRow()}}, \code{\link[=fixedRow]{fixedRow()}}.
}

View File

@@ -125,12 +125,12 @@ function.
}
\section{Functions}{
\itemize{
\item \code{quoToFunction}: convert a quosure to a function.
\item \code{quoToFunction()}: convert a quosure to a function.
\item \code{installExprFunction}: converts a user's reactive \code{expr} into a
\item \code{installExprFunction()}: converts a user's reactive \code{expr} into a
function that's assigned to a \code{name} in the \code{assign.env}.
}}
}}
\examples{
# A custom render function that repeats the supplied value 3 times
renderTriple <- function(expr) {

View File

@@ -84,24 +84,26 @@ Please see the function descriptions for more details.
}
\section{Functions}{
\itemize{
\item \code{devmode}: Function to set two options to enable/disable Shiny
\item \code{devmode()}: Function to set two options to enable/disable Shiny
Developer Mode and Developer messages
\item \code{in_devmode}: Determines if Shiny is in Developer Mode. If the
\item \code{in_devmode()}: Determines if Shiny is in Developer Mode. If the
\code{getOption("shiny.devmode")} is set to \code{TRUE} and not in testing inside
\code{testthat}, then Shiny Developer Mode is enabled.
\item \code{with_devmode}: Temporarily set Shiny Developer Mode and Developer
\item \code{with_devmode()}: Temporarily set Shiny Developer Mode and Developer
message verbosity
\item \code{devmode_inform}: If Shiny Developer Mode and verbosity are enabled,
\item \code{devmode_inform()}: If Shiny Developer Mode and verbosity are enabled,
displays a message once every 8 hrs (by default)
\item \code{register_devmode_option}: Registers a Shiny Developer Mode option with an updated
\item \code{register_devmode_option()}: Registers a Shiny Developer Mode option with an updated
value and Developer message. This registration method allows package
authors to write one message in a single location.
For example, the following Shiny Developer Mode options are registered:\if{html}{\out{<div class="sourceCode r">}}\preformatted{# Reload the Shiny app when a sourced R file changes
For example, the following Shiny Developer Mode options are registered:
\if{html}{\out{<div class="sourceCode r">}}\preformatted{# Reload the Shiny app when a sourced R file changes
register_devmode_option(
"shiny.autoreload",
"Turning on shiny autoreload. To disable, call `options(shiny.autoreload = FALSE)`",
@@ -126,7 +128,9 @@ register_devmode_option(
Other known, non-Shiny Developer Mode options:
\itemize{
\item Sass:
}\if{html}{\out{<div class="sourceCode r">}}\preformatted{# Display the full stack trace when errors occur during Shiny app execution
}
\if{html}{\out{<div class="sourceCode r">}}\preformatted{# Display the full stack trace when errors occur during Shiny app execution
register_devmode_option(
"sass.cache",
"Turning off sass cache. To use default caching, call `options(sass.cache = TRUE)`",
@@ -134,7 +138,7 @@ register_devmode_option(
)
}\if{html}{\out{</div>}}
\item \code{get_devmode_option}: Provides a consistent way to change the expected
\item \code{get_devmode_option()}: Provides a consistent way to change the expected
\code{\link[=getOption]{getOption()}} behavior when Developer Mode is enabled. This method is very
similar to \code{\link[=getOption]{getOption()}} where the globally set option takes precedence.
See section "Avoiding direct dependency on shiny" for
@@ -144,8 +148,8 @@ See section "Avoiding direct dependency on shiny" for
\code{register_devmode_option()} to avoid supplying the same \code{devmode_default}
and \code{devmode_message} values throughout your package. (This requires a
\pkg{shiny} dependency.)
}}
}}
\section{Avoiding direct dependency on shiny}{
@@ -165,7 +169,9 @@ re-implementing these two functions:
This function should return \code{TRUE} if \code{getOption("shiny.devmode")} is set.
In addition, we strongly recommend that it also checks to make sure
\code{testthat} is not testing.\if{html}{\out{<div class="sourceCode r">}}\preformatted{in_devmode <- function() \{
\code{testthat} is not testing.
\if{html}{\out{<div class="sourceCode r">}}\preformatted{in_devmode <- function() \{
isTRUE(getOption("shiny.devmode", FALSE)) &&
!identical(Sys.getenv("TESTTHAT"), "true")
\}
@@ -201,7 +207,9 @@ recommend displaying a message (\code{devmode_message}) to \code{stderr()} once
hours using \code{\link[rlang:abort]{rlang::inform()}}. This will keep the author up to date as to
which Dev Mode options are being altered. To allow developers a chance to
disable Dev Mode messages, the message should be skipped if
\code{getOption("shiny.devmode.verbose", TRUE)} is not \code{TRUE}.\if{html}{\out{<div class="sourceCode r">}}\preformatted{get_devmode_option <- function(name, default = NULL, devmode_default, devmode_message) \{
\code{getOption("shiny.devmode.verbose", TRUE)} is not \code{TRUE}.
\if{html}{\out{<div class="sourceCode r">}}\preformatted{get_devmode_option <- function(name, default = NULL, devmode_default, devmode_message) \{
if (!in_devmode()) \{
# Dev Mode disabled, act like `getOption()`
return(getOption(name, default = default))

View File

@@ -40,7 +40,7 @@ deleted from disk. If \code{FALSE} (the default), it will do nothing when
finalized.}
\item{missing}{A value to return when \code{get(key)} is called but the key is not
present in the cache. The default is a \code{\link[cachem:reexports]{key_missing()}} object. It is
present in the cache. The default is a \code{\link[cachem:key_missing]{key_missing()}} object. It is
actually an expression that is evaluated each time there is a cache miss.
See section Missing keys for more information.}

View File

@@ -4,7 +4,7 @@
\alias{downloadHandler}
\title{File Downloads}
\usage{
downloadHandler(filename, content, contentType = NA, outputArgs = list())
downloadHandler(filename, content, contentType = NULL, outputArgs = list())
}
\arguments{
\item{filename}{A string of the filename, including extension, that the
@@ -19,9 +19,9 @@ function.)}
\item{contentType}{A string of the download's
\href{https://en.wikipedia.org/wiki/Internet_media_type}{content type}, for
example \code{"text/csv"} or \code{"image/png"}. If \code{NULL} or
\code{NA}, the content type will be guessed based on the filename
extension, or \code{application/octet-stream} if the extension is unknown.}
example \code{"text/csv"} or \code{"image/png"}. If \code{NULL}, the content type
will be guessed based on the filename extension, or
\code{application/octet-stream} if the extension is unknown.}
\item{outputArgs}{A list of arguments to be passed through to the implicit
call to \code{\link[=downloadButton]{downloadButton()}} when \code{downloadHandler} is used

View File

@@ -11,7 +11,8 @@ fileInput(
accept = NULL,
width = NULL,
buttonLabel = "Browse...",
placeholder = "No file selected"
placeholder = "No file selected",
capture = NULL
)
}
\arguments{
@@ -42,6 +43,19 @@ see \code{\link[=validateCssUnit]{validateCssUnit()}}.}
object.}
\item{placeholder}{The text to show before a file has been uploaded.}
\item{capture}{What source to use for capturing image, audio or video data.
This attribute facilitates user access to a device's media capture
mechanism, such as a camera, or microphone, from within a file upload
control.
A value of \code{user} indicates that the user-facing camera and/or microphone
should be used. A value of \code{environment} specifies that the outward-facing
camera and/or microphone should be used.
By default on most phones, this will accept still photos or video. For
still photos only, also use \code{accept="image/*"}. For video only, use
\code{accept="video/*"}.}
}
\description{
Create a file upload control that can be used to upload one or more files.

View File

@@ -37,11 +37,10 @@ shown in the document).}
build of Bootstrap 3 with a customized version of Bootstrap 3 or higher.
\item A character string pointing to an alternative Bootstrap stylesheet
(normally a css file within the www directory, e.g. \code{www/bootstrap.css}).
This option is here mainly for legacy reasons.
}}
\item{lang}{ISO 639-1 language code for the HTML page, such as "en" or "ko".
This will be used as the lang in the \verb{<html>} tag, as in \verb{<html lang="en">}.
This will be used as the lang in the \code{<html>} tag, as in \code{<html lang="en">}.
The default (NULL) results in an empty string.}
}
\description{
@@ -102,7 +101,9 @@ fillPage(
}
\seealso{
Other layout functions:
\code{\link{fixedPage}()},
\code{\link{flowLayout}()},
\code{\link{fluidPage}()},
\code{\link{navbarPage}()},
\code{\link{sidebarLayout}()},
\code{\link{splitLayout}()},

85
man/fixedPage.Rd Normal file
View File

@@ -0,0 +1,85 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/bootstrap-layout.R
\name{fixedPage}
\alias{fixedPage}
\alias{fixedRow}
\title{Create a page with a fixed layout}
\usage{
fixedPage(..., title = NULL, theme = NULL, lang = NULL)
fixedRow(...)
}
\arguments{
\item{...}{Elements to include within the container}
\item{title}{The browser window title (defaults to the host URL of the page)}
\item{theme}{One of the following:
\itemize{
\item \code{NULL} (the default), which implies a "stock" build of Bootstrap 3.
\item A \code{\link[bslib:bs_theme]{bslib::bs_theme()}} object. This can be used to replace a stock
build of Bootstrap 3 with a customized version of Bootstrap 3 or higher.
\item A character string pointing to an alternative Bootstrap stylesheet
(normally a css file within the www directory, e.g. \code{www/bootstrap.css}).
}}
\item{lang}{ISO 639-1 language code for the HTML page, such as "en" or "ko".
This will be used as the lang in the \code{<html>} tag, as in \code{<html lang="en">}.
The default (NULL) results in an empty string.}
}
\value{
A UI definition that can be passed to the \link{shinyUI} function.
}
\description{
Functions for creating fixed page layouts. A fixed page layout consists of
rows which in turn include columns. Rows exist for the purpose of making sure
their elements appear on the same line (if the browser has adequate width).
Columns exist for the purpose of defining how much horizontal space within a
12-unit wide grid it's elements should occupy. Fixed pages limit their width
to 940 pixels on a typical display, and 724px or 1170px on smaller and larger
displays respectively.
}
\details{
To create a fixed page use the \code{fixedPage} function and include
instances of \code{fixedRow} and \code{\link[=column]{column()}} within it. Note that
unlike \code{\link[=fluidPage]{fluidPage()}}, fixed pages cannot make use of higher-level
layout functions like \code{sidebarLayout}, rather, all layout must be done
with \code{fixedRow} and \code{column}.
}
\note{
See the \href{https://shiny.rstudio.com/articles/layout-guide.html}{ Shiny Application Layout Guide} for additional details on laying out fixed
pages.
}
\examples{
## Only run examples in interactive R sessions
if (interactive()) {
ui <- fixedPage(
title = "Hello, Shiny!",
fixedRow(
column(width = 4,
"4"
),
column(width = 3, offset = 2,
"3 offset 2"
)
)
)
shinyApp(ui, server = function(input, output) { })
}
}
\seealso{
\code{\link[=column]{column()}}
Other layout functions:
\code{\link{fillPage}()},
\code{\link{flowLayout}()},
\code{\link{fluidPage}()},
\code{\link{navbarPage}()},
\code{\link{sidebarLayout}()},
\code{\link{splitLayout}()},
\code{\link{verticalLayout}()}
}
\concept{layout functions}

View File

@@ -34,6 +34,8 @@ shinyApp(ui, server = function(input, output) { })
\seealso{
Other layout functions:
\code{\link{fillPage}()},
\code{\link{fixedPage}()},
\code{\link{fluidPage}()},
\code{\link{navbarPage}()},
\code{\link{sidebarLayout}()},
\code{\link{splitLayout}()},

119
man/fluidPage.Rd Normal file
View File

@@ -0,0 +1,119 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/bootstrap-layout.R
\name{fluidPage}
\alias{fluidPage}
\alias{fluidRow}
\title{Create a page with fluid layout}
\usage{
fluidPage(..., title = NULL, theme = NULL, lang = NULL)
fluidRow(...)
}
\arguments{
\item{...}{Elements to include within the page}
\item{title}{The browser window title (defaults to the host URL of the page).
Can also be set as a side effect of the \code{\link[=titlePanel]{titlePanel()}} function.}
\item{theme}{One of the following:
\itemize{
\item \code{NULL} (the default), which implies a "stock" build of Bootstrap 3.
\item A \code{\link[bslib:bs_theme]{bslib::bs_theme()}} object. This can be used to replace a stock
build of Bootstrap 3 with a customized version of Bootstrap 3 or higher.
\item A character string pointing to an alternative Bootstrap stylesheet
(normally a css file within the www directory, e.g. \code{www/bootstrap.css}).
}}
\item{lang}{ISO 639-1 language code for the HTML page, such as "en" or "ko".
This will be used as the lang in the \code{<html>} tag, as in \code{<html lang="en">}.
The default (NULL) results in an empty string.}
}
\value{
A UI definition that can be passed to the \link{shinyUI} function.
}
\description{
Functions for creating fluid page layouts. A fluid page layout consists of
rows which in turn include columns. Rows exist for the purpose of making sure
their elements appear on the same line (if the browser has adequate width).
Columns exist for the purpose of defining how much horizontal space within a
12-unit wide grid it's elements should occupy. Fluid pages scale their
components in realtime to fill all available browser width.
}
\details{
To create a fluid page use the \code{fluidPage} function and include
instances of \code{fluidRow} and \code{\link[=column]{column()}} within it. As an
alternative to low-level row and column functions you can also use
higher-level layout functions like \code{\link[=sidebarLayout]{sidebarLayout()}}.
}
\note{
See the \href{https://shiny.rstudio.com/articles/layout-guide.html}{ Shiny-Application-Layout-Guide} for additional details on laying out fluid
pages.
}
\examples{
## Only run examples in interactive R sessions
if (interactive()) {
# Example of UI with fluidPage
ui <- fluidPage(
# Application title
titlePanel("Hello Shiny!"),
sidebarLayout(
# Sidebar with a slider input
sidebarPanel(
sliderInput("obs",
"Number of observations:",
min = 0,
max = 1000,
value = 500)
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
)
# Server logic
server <- function(input, output) {
output$distPlot <- renderPlot({
hist(rnorm(input$obs))
})
}
# Complete app with UI and server components
shinyApp(ui, server)
# UI demonstrating column layouts
ui <- fluidPage(
title = "Hello Shiny!",
fluidRow(
column(width = 4,
"4"
),
column(width = 3, offset = 2,
"3 offset 2"
)
)
)
shinyApp(ui, server = function(input, output) { })
}
}
\seealso{
\code{\link[=column]{column()}}
Other layout functions:
\code{\link{fillPage}()},
\code{\link{fixedPage}()},
\code{\link{flowLayout}()},
\code{\link{navbarPage}()},
\code{\link{sidebarLayout}()},
\code{\link{splitLayout}()},
\code{\link{verticalLayout}()}
}
\concept{layout functions}

View File

@@ -15,7 +15,7 @@ loadSupport(
not supplied, the nearest enclosing directory that is a Shiny app, starting
with the current directory, is used.}
\item{renv}{The environmeny in which the files in the \verb{R/} directory should
\item{renv}{The environment in which the files in the \verb{R/} directory should
be evaluated.}
\item{globalrenv}{The environment in which \code{global.R} should be evaluated. If

View File

@@ -30,7 +30,7 @@ value of \code{evict}. Use \code{Inf} for no limit of number of items.}
when a cache pruning occurs. Currently, \code{"lru"} and \code{"fifo"} are supported.}
\item{missing}{A value to return when \code{get(key)} is called but the key is not
present in the cache. The default is a \code{\link[cachem:reexports]{key_missing()}} object. It is
present in the cache. The default is a \code{\link[cachem:key_missing]{key_missing()}} object. It is
actually an expression that is evaluated each time there is a cache miss.
See section Missing keys for more information.}

View File

@@ -71,7 +71,6 @@ layout.}
build of Bootstrap 3 with a customized version of Bootstrap 3 or higher.
\item A character string pointing to an alternative Bootstrap stylesheet
(normally a css file within the www directory, e.g. \code{www/bootstrap.css}).
This option is here mainly for legacy reasons.
}}
\item{windowTitle}{the browser window title (as a character string). The
@@ -80,7 +79,7 @@ default value, \code{NA}, means to use any character strings that appear in
default).}
\item{lang}{ISO 639-1 language code for the HTML page, such as "en" or "ko".
This will be used as the lang in the \verb{<html>} tag, as in \verb{<html lang="en">}.
This will be used as the lang in the \code{<html>} tag, as in \code{<html lang="en">}.
The default (NULL) results in an empty string.}
\item{menuName}{A name that identifies this \code{navbarMenu}. This
@@ -90,7 +89,7 @@ is needed if you want to insert/remove or show/hide an entire
\item{icon}{Optional icon to appear on a \code{navbarMenu} tab.}
}
\value{
A UI defintion that can be passed to the \link{shinyUI} function.
A UI definition that can be passed to the \link{shinyUI} function.
}
\description{
Create a page that contains a top level navigation bar that can be used to
@@ -125,7 +124,9 @@ navbarPage("App Title",
Other layout functions:
\code{\link{fillPage}()},
\code{\link{fixedPage}()},
\code{\link{flowLayout}()},
\code{\link{fluidPage}()},
\code{\link{sidebarLayout}()},
\code{\link{splitLayout}()},
\code{\link{verticalLayout}()}

View File

@@ -14,7 +14,7 @@ pageWithSidebar(headerPanel, sidebarPanel, mainPanel)
\item{mainPanel}{The \link{mainPanel} containing outputs}
}
\value{
A UI defintion that can be passed to the \link{shinyUI} function
A UI definition that can be passed to the \link{shinyUI} function
}
\description{
\strong{DEPRECATED}: use \code{\link[=fluidPage]{fluidPage()}} and \code{\link[=sidebarLayout]{sidebarLayout()}} instead.

View File

@@ -2,7 +2,7 @@
% Please edit documentation in R/imageutils.R
\name{plotPNG}
\alias{plotPNG}
\title{Run a plotting function and save the output as a PNG}
\title{Capture a plot as a PNG file.}
\usage{
plotPNG(
func,
@@ -23,27 +23,26 @@ extension \code{.png}.}
\item{height}{Height in pixels.}
\item{res}{Resolution in pixels per inch. This value is passed to
\code{\link[grDevices:png]{grDevices::png()}}. Note that this affects the resolution of PNG rendering in
\item{res}{Resolution in pixels per inch. This value is passed to the
graphics device. Note that this affects the resolution of PNG rendering in
R; it won't change the actual ppi of the browser.}
\item{...}{Arguments to be passed through to \code{\link[grDevices:png]{grDevices::png()}}.
These can be used to set the width, height, background color, etc.}
\item{...}{Arguments to be passed through to the graphics device. These can
be used to set the width, height, background color, etc.}
}
\value{
A path to the newly generated PNG file.
}
\description{
This function returns the name of the PNG file that it generates. In
essence, it calls \code{png()}, then \code{func()}, then \code{dev.off()}.
So \code{func} must be a function that will generate a plot when used this
way.
The PNG graphics device used is determined in the following order:
\itemize{
\item If the ragg package is installed (and the \code{shiny.useragg} is not
set to \code{FALSE}), then use \code{\link[ragg:agg_png]{ragg::agg_png()}}.
\item If a quartz device is available (i.e., \code{capabilities("aqua")} is
\code{TRUE}), then use \code{png(type = "quartz")}.
\item If the Cairo package is installed (and the \code{shiny.usecairo} option
is not set to \code{FALSE}), then use \code{\link[Cairo:Cairo]{Cairo::CairoPNG()}}.
\item Otherwise, use \code{\link[grDevices:png]{grDevices::png()}}. In this case, Linux and Windows
may not antialias some point shapes, resulting in poor quality output.
}
\details{
For output, it will try to use the following devices, in this order:
quartz (via \code{\link[grDevices:png]{grDevices::png()}}), then \code{\link[Cairo:Cairo]{Cairo::CairoPNG()}},
and finally \code{\link[grDevices:png]{grDevices::png()}}. This is in order of quality of
output. Notably, plain \code{png} output on Linux and Windows may not
antialias some point shapes, resulting in poor quality output.
In some cases, \code{Cairo()} provides output that looks worse than
\code{png()}. To disable Cairo output for an app, use
\code{options(shiny.usecairo=FALSE)}.
}

View File

@@ -51,11 +51,11 @@ of the source code of your reactive expressions and observers.
}
\section{Functions}{
\itemize{
\item \code{reactlog}: Return a list of reactive information. Can be used in conjunction with
\item \code{reactlog()}: Return a list of reactive information. Can be used in conjunction with
\link[reactlog:reactlog_show]{reactlog::reactlog_show} to later display the reactlog graph.
\item \code{reactlogShow}: Display a full reactlog graph for all sessions.
\item \code{reactlogShow()}: Display a full reactlog graph for all sessions.
\item \code{reactlogReset()}: Resets the entire reactlog stack. Useful for debugging and removing all prior reactive history.
\item \code{reactlogReset}: Resets the entire reactlog stack. Useful for debugging and removing all prior reactive history.
}}

View File

@@ -52,6 +52,6 @@ below to see their documentation.
\describe{
\item{fastmap}{\code{\link[fastmap:key_missing]{is.key_missing}}, \code{\link[fastmap]{key_missing}}}
\item{htmltools}{\code{\link[htmltools]{HTML}}, \code{\link[htmltools:builder]{a}}, \code{\link[htmltools:builder]{br}}, \code{\link[htmltools:builder]{code}}, \code{\link[htmltools:builder]{div}}, \code{\link[htmltools:builder]{em}}, \code{\link[htmltools:builder]{h1}}, \code{\link[htmltools:builder]{h2}}, \code{\link[htmltools:builder]{h3}}, \code{\link[htmltools:builder]{h4}}, \code{\link[htmltools:builder]{h5}}, \code{\link[htmltools:builder]{h6}}, \code{\link[htmltools:builder]{hr}}, \code{\link[htmltools]{htmlTemplate}}, \code{\link[htmltools:builder]{img}}, \code{\link[htmltools:include]{includeCSS}}, \code{\link[htmltools:include]{includeHTML}}, \code{\link[htmltools:include]{includeMarkdown}}, \code{\link[htmltools:include]{includeScript}}, \code{\link[htmltools:include]{includeText}}, \code{\link[htmltools:singleton]{is.singleton}}, \code{\link[htmltools:builder]{p}}, \code{\link[htmltools:builder]{pre}}, \code{\link[htmltools]{singleton}}, \code{\link[htmltools:builder]{span}}, \code{\link[htmltools:builder]{strong}}, \code{\link[htmltools]{suppressDependencies}}, \code{\link[htmltools:builder]{tag}}, \code{\link[htmltools]{tagAppendAttributes}}, \code{\link[htmltools]{tagAppendChild}}, \code{\link[htmltools:tagAppendChild]{tagAppendChildren}}, \code{\link[htmltools:tagAppendAttributes]{tagGetAttribute}}, \code{\link[htmltools:tagAppendAttributes]{tagHasAttribute}}, \code{\link[htmltools]{tagList}}, \code{\link[htmltools:tagAppendChild]{tagSetChildren}}, \code{\link[htmltools:builder]{tags}}, \code{\link[htmltools]{validateCssUnit}}, \code{\link[htmltools]{withTags}}}
\item{htmltools}{\code{\link[htmltools:builder]{a}}, \code{\link[htmltools:builder]{br}}, \code{\link[htmltools:builder]{code}}, \code{\link[htmltools:builder]{div}}, \code{\link[htmltools:builder]{em}}, \code{\link[htmltools:builder]{h1}}, \code{\link[htmltools:builder]{h2}}, \code{\link[htmltools:builder]{h3}}, \code{\link[htmltools:builder]{h4}}, \code{\link[htmltools:builder]{h5}}, \code{\link[htmltools:builder]{h6}}, \code{\link[htmltools:builder]{hr}}, \code{\link[htmltools]{HTML}}, \code{\link[htmltools]{htmlTemplate}}, \code{\link[htmltools:builder]{img}}, \code{\link[htmltools:include]{includeCSS}}, \code{\link[htmltools:include]{includeHTML}}, \code{\link[htmltools:include]{includeMarkdown}}, \code{\link[htmltools:include]{includeScript}}, \code{\link[htmltools:include]{includeText}}, \code{\link[htmltools:singleton]{is.singleton}}, \code{\link[htmltools:builder]{p}}, \code{\link[htmltools:builder]{pre}}, \code{\link[htmltools]{singleton}}, \code{\link[htmltools:builder]{span}}, \code{\link[htmltools:builder]{strong}}, \code{\link[htmltools]{suppressDependencies}}, \code{\link[htmltools:builder]{tag}}, \code{\link[htmltools]{tagAppendAttributes}}, \code{\link[htmltools]{tagAppendChild}}, \code{\link[htmltools:tagAppendChild]{tagAppendChildren}}, \code{\link[htmltools:tagAppendAttributes]{tagGetAttribute}}, \code{\link[htmltools:tagAppendAttributes]{tagHasAttribute}}, \code{\link[htmltools]{tagList}}, \code{\link[htmltools:builder]{tags}}, \code{\link[htmltools:tagAppendChild]{tagSetChildren}}, \code{\link[htmltools]{validateCssUnit}}, \code{\link[htmltools]{withTags}}}
}}

View File

@@ -37,7 +37,7 @@ information on the default sizing policy.}
(the default), \code{"session"}, or a cache object like a
\code{\link[cachem:cache_disk]{cachem::cache_disk()}}. See the Cache Scoping section for more information.}
\item{...}{Arguments to be passed through to \code{\link[grDevices:png]{grDevices::png()}}.
\item{...}{Arguments to be passed through to \code{\link[=plotPNG]{plotPNG()}}.
These can be used to set the width, height, background color, etc.}
\item{alt}{Alternate text for the HTML \verb{<img>} tag if it cannot be displayed

View File

@@ -35,10 +35,10 @@ When rendering an inline plot, you must provide numeric values (in pixels)
to both \code{width} and \code{height}.}
\item{res}{Resolution of resulting plot, in pixels per inch. This value is
passed to \code{\link[grDevices:png]{grDevices::png()}}. Note that this affects the resolution of PNG
passed to \code{\link[=plotPNG]{plotPNG()}}. Note that this affects the resolution of PNG
rendering in R; it won't change the actual ppi of the browser.}
\item{...}{Arguments to be passed through to \code{\link[grDevices:png]{grDevices::png()}}.
\item{...}{Arguments to be passed through to \code{\link[=plotPNG]{plotPNG()}}.
These can be used to set the width, height, background color, etc.}
\item{alt}{Alternate text for the HTML \verb{<img>} tag if it cannot be displayed

View File

@@ -25,26 +25,30 @@ nor displayed in the Shiny app's UI).
\details{
The \code{req} function was designed to be used in one of two ways. The first
is to call it like a statement (ignoring its return value) before attempting
operations using the required values:\preformatted{rv <- reactiveValues(state = FALSE)
operations using the required values:
\if{html}{\out{<div class="sourceCode">}}\preformatted{rv <- reactiveValues(state = FALSE)
r <- reactive(\{
req(input$a, input$b, rv$state)
# Code that uses input$a, input$b, and/or rv$state...
\})
}
}\if{html}{\out{</div>}}
In this example, if \code{r()} is called and any of \code{input$a},
\code{input$b}, and \code{rv$state} are \code{NULL}, \code{FALSE}, \code{""},
etc., then the \code{req} call will trigger an error that propagates all the
way up to whatever render block or observer is executing.
The second is to use it to wrap an expression that must be truthy:\preformatted{output$plot <- renderPlot(\{
The second is to use it to wrap an expression that must be truthy:
\if{html}{\out{<div class="sourceCode">}}\preformatted{output$plot <- renderPlot(\{
if (req(input$plotType) == "histogram") \{
hist(dataset())
\} else if (input$plotType == "scatter") \{
qplot(dataset(), aes(x = x, y = y))
\}
\})
}
}\if{html}{\out{</div>}}
In this example, \code{req(input$plotType)} first checks that
\code{input$plotType} is truthy, and if so, returns it. This is a convenient

View File

@@ -37,7 +37,7 @@ ports will be tried.}
\item{launch.browser}{If true, the system's default web browser will be
launched automatically after the app is started. Defaults to true in
interactive sessions only. This value of this parameter can also be a
interactive sessions only. The value of this parameter can also be a
function to call with the application's URL.}
\item{host}{The IPv4 address that the application should listen on. Defaults

View File

@@ -13,7 +13,7 @@ runGist(gist, destdir = NULL, ...)
runGitHub(
repo,
username = getOption("github.user"),
ref = "master",
ref = "HEAD",
subdir = NULL,
destdir = NULL,
...
@@ -47,7 +47,8 @@ all valid values.}
\code{"username/repo"}, \code{username} will be taken from \code{repo}.}
\item{ref}{Desired git reference. Could be a commit, tag, or branch name.
Defaults to \code{"master"}.}
Defaults to \code{"HEAD"}, which means the default branch on GitHub, typically
\code{"main"} or \code{"master"}.}
}
\description{
\code{runUrl()} downloads and launches a Shiny application that is hosted at

View File

@@ -96,9 +96,10 @@ The equivalent of hitting the browser's Reload button. Only works if the
session is actually connected.
}
\item{request}{
An environment that implements the Rook specification for HTTP requests.
This is the request that was used to initiate the websocket connection
(as opposed to the request that downloaded the web page for the app).
An environment that implements the \href{https://github.com/jeffreyhorner/Rook#the-environment}{Rook specification} for
HTTP requests. This is the request that was used to initiate the websocket
connection (as opposed to the request that downloaded the web page for the
app).
}
\item{userData}{
An environment for app authors and module/package authors to store whatever

View File

@@ -10,7 +10,7 @@ shinyAppTemplate(path = NULL, examples = "default", dryrun = FALSE)
\item{path}{Path to create new shiny application template.}
\item{examples}{Either one of "default", "ask", "all", or any combination of
"app", "rdir", "module", "shinytest", and "testthat". In an
"app", "rdir", "module", and "tests". In an
interactive session, "default" falls back to "ask"; in a non-interactive
session, "default" falls back to "all". With "ask", this function will
prompt the user to select which template items will be added to the new app
@@ -25,30 +25,31 @@ This function populates a directory with files for a Shiny application.
}
\details{
In an interactive R session, this function will, by default, prompt the user
to select which components to add to the application. Choices are\preformatted{1: All
to select which components to add to the application. Choices are
\if{html}{\out{<div class="sourceCode">}}\preformatted{1: All
2: app.R : Main application file
3: R/example.R : Helper file with R code
4: R/example-module.R : Example module
5: tests/shinytest/ : Tests using the shinytest package
6: tests/testthat/ : Tests using the testthat package
}
5: tests/testthat/ : Tests using the testthat and shinytest2 package
}\if{html}{\out{</div>}}
If option 1 is selected, the full example application including the
following files and directories is created:\preformatted{appdir/
following files and directories is created:
\if{html}{\out{<div class="sourceCode">}}\preformatted{appdir/
|- app.R
|- R
| |- example-module.R
| `- example.R
`- tests
|- shinytest.R
|- shinytest
| `- mytest.R
|- testthat.R
`- testthat
|- test-examplemodule.R
|- test-server.R
|- test-shinytest2.R
`- test-sort.R
}
}\if{html}{\out{</div>}}
Some notes about these files:
\itemize{
@@ -62,15 +63,15 @@ and the second contains code for module created by the
\item \verb{tests/} contains various tests for the application. You may
choose to use or remove any of them. They can be executed by the
\code{\link[=runTests]{runTests()}} function.
\item \code{tests/shinytest.R} is a test runner for test files in the
\verb{tests/shinytest/} directory.
\item \code{tests/shinytest/mytest.R} is a test that uses the
\href{https://rstudio.github.io/shinytest/}{shinytest} package to do
snapshot-based testing.
\item \code{tests/testthat.R} is a test runner for test files in the
\verb{tests/testthat/} directory using the \href{https://testthat.r-lib.org/}{testthat} package.
\verb{tests/testthat/} directory using the
\href{https://rstudio.github.io/shinytest2/reference/test_app.html}{shinytest2}
package.
\item \code{tests/testthat/test-examplemodule.R} is a test for an application's module server function.
\item \code{tests/testthat/test-server.R} is a test for the application's server code
\item \code{tests/testthat/test-shinytest2.R} is a test that uses the
\href{https://rstudio.github.io/shinytest2/}{shinytest2} package to do
snapshot-based testing.
\item \code{tests/testthat/test-sort.R} is a test for a supporting function in the \verb{R/} directory.
}
}

View File

@@ -73,6 +73,10 @@ then jQuery 3.6.0 is used.}
numbers to JSON format to send to the client web browser.}
\item{shiny.launch.browser (defaults to \code{interactive()})}{A boolean which controls the default behavior
when an app is run. See \code{\link[=runApp]{runApp()}} for more information.}
\item{shiny.mathjax.url (defaults to \code{"https://mathjax.rstudio.com/latest/MathJax.js"})}{
The URL that should be used to load MathJax, via \code{\link[=withMathJax]{withMathJax()}}.}
\item{shiny.mathjax.config (defaults to \code{"config=TeX-AMS-MML_HTMLorMML"})}{The querystring
used to load MathJax, via \code{\link[=withMathJax]{withMathJax()}}.}
\item{shiny.maxRequestSize (defaults to 5MB)}{This is a number which specifies the maximum
web request size, which serves as a size limit for file uploads.}
\item{shiny.minified (defaults to \code{TRUE})}{By default
@@ -104,6 +108,9 @@ should only be used for debugging or demonstrations of reactivity at the
console.}
\item{shiny.testmode (defaults to \code{FALSE})}{If \code{TRUE}, then various features for testing Shiny
applications are enabled.}
\item{shiny.snapshotsortc (defaults to \code{FALSE})}{If \code{TRUE}, test snapshot keys
for \pkg{shinytest} will be sorted consistently using the C locale. Snapshots
retrieved by \pkg{shinytest2} will always sort using the C locale.}
\item{shiny.trace (defaults to \code{FALSE})}{Print messages sent between the R server and the web
browser client to the R console. This is useful for debugging. Possible
values are \code{"send"} (only print messages sent to the client),
@@ -112,9 +119,10 @@ values are \code{"send"} (only print messages sent to the client),
messages).}
\item{shiny.autoload.r (defaults to \code{TRUE})}{If \code{TRUE}, then the R/
of a shiny app will automatically be sourced.}
\item{shiny.usecairo (defaults to \code{TRUE})}{This is used to disable graphical rendering by the
Cairo package, if it is installed. See \code{\link[=plotPNG]{plotPNG()}} for more
information.}
\item{shiny.useragg (defaults to \code{TRUE})}{Set to \code{FALSE} to prevent PNG rendering via the
ragg package. See \code{\link[=plotPNG]{plotPNG()}} for more information.}
\item{shiny.usecairo (defaults to \code{TRUE})}{Set to \code{FALSE} to prevent PNG rendering via the
Cairo package. See \code{\link[=plotPNG]{plotPNG()}} for more information.}
\item{shiny.devmode (defaults to \code{NULL})}{Option to enable Shiny Developer Mode. When set,
different default \code{getOption(key)} values will be returned. See \code{\link[=devmode]{devmode()}} for more details.}
}

View File

@@ -31,7 +31,7 @@ the Shiny application's page. It must take an \code{input} and an
optional \code{session} parameter, which is used when greater control is
needed.
See the \href{https://rstudio.github.io/shiny/tutorial/}{tutorial} for more
See the \href{https://shiny.rstudio.com/tutorial/}{tutorial} for more
on how to write a server function.
}
\examples{

View File

@@ -83,7 +83,9 @@ shinyApp(ui, server)
\seealso{
Other layout functions:
\code{\link{fillPage}()},
\code{\link{fixedPage}()},
\code{\link{flowLayout}()},
\code{\link{fluidPage}()},
\code{\link{navbarPage}()},
\code{\link{splitLayout}()},
\code{\link{verticalLayout}()}

View File

@@ -64,7 +64,9 @@ shinyApp(ui, server)
\seealso{
Other layout functions:
\code{\link{fillPage}()},
\code{\link{fixedPage}()},
\code{\link{flowLayout}()},
\code{\link{fluidPage}()},
\code{\link{navbarPage}()},
\code{\link{sidebarLayout}()},
\code{\link{verticalLayout}()}

View File

@@ -29,12 +29,12 @@ Create a tab panel
}
\section{Functions}{
\itemize{
\item \code{tabPanel}: Create a tab panel that can be included within a \code{\link[=tabsetPanel]{tabsetPanel()}} or a \code{\link[=navbarPage]{navbarPage()}}.
\item \code{tabPanel()}: Create a tab panel that can be included within a \code{\link[=tabsetPanel]{tabsetPanel()}} or a \code{\link[=navbarPage]{navbarPage()}}.
\item \code{tabPanelBody}: Create a tab panel that drops the title argument.
\item \code{tabPanelBody()}: Create a tab panel that drops the title argument.
This function should be used within \code{tabsetPanel(type = "hidden")}. See \code{\link[=tabsetPanel]{tabsetPanel()}} for example usage.
}}
}}
\examples{
# Show a tabset that includes a plot, summary, and
# table view of the generated distribution

View File

@@ -33,17 +33,7 @@ types (such as logicals and numbers) will be coerced to strings.}
\item{inline}{If \code{TRUE}, render the choices inline (i.e. horizontally)}
\item{choiceNames}{List of names and values, respectively,
that are displayed to the user in the app and correspond to the each
choice (for this reason, \code{choiceNames} and \code{choiceValues}
must have the same length). If either of these arguments is
provided, then the other \emph{must} be provided and \code{choices}
\emph{must not} be provided. The advantage of using both of these over
a named list for \code{choices} is that \code{choiceNames} allows any
type of UI object to be passed through (tag objects, icons, HTML code,
...), instead of just simple text. See Examples.}
\item{choiceValues}{List of names and values, respectively,
\item{choiceNames, choiceValues}{List of names and values, respectively,
that are displayed to the user in the app and correspond to the each
choice (for this reason, \code{choiceNames} and \code{choiceValues}
must have the same length). If either of these arguments is

View File

@@ -35,16 +35,7 @@ use \code{character(0)}.}
\item{inline}{If \code{TRUE}, render the choices inline (i.e. horizontally)}
\item{choiceNames}{List of names and values, respectively, that
are displayed to the user in the app and correspond to the each choice (for
this reason, \code{choiceNames} and \code{choiceValues} must have the same length).
If either of these arguments is provided, then the other \emph{must} be provided
and \code{choices} \emph{must not} be provided. The advantage of using both of these
over a named list for \code{choices} is that \code{choiceNames} allows any type of UI
object to be passed through (tag objects, icons, HTML code, ...), instead
of just simple text. See Examples.}
\item{choiceValues}{List of names and values, respectively, that
\item{choiceNames, choiceValues}{List of names and values, respectively, that
are displayed to the user in the app and correspond to the each choice (for
this reason, \code{choiceNames} and \code{choiceValues} must have the same length).
If either of these arguments is provided, then the other \emph{must} be provided

View File

@@ -29,10 +29,7 @@ updateSliderInput(
create a regular slider; a length two vector will create a double-ended
range slider. Must lie between \code{min} and \code{max}.}
\item{min}{The minimum and maximum values (inclusive) that can be
selected.}
\item{max}{The minimum and maximum values (inclusive) that can be
\item{min, max}{The minimum and maximum values (inclusive) that can be
selected.}
\item{step}{Specifies the interval between each selectable value on the

View File

@@ -55,10 +55,12 @@ can create your own validation test functions. A passing test should return
to display to the user, or if the failure should happen silently, \code{FALSE}.
Alternatively you can use \code{validate()} within an \code{if} statement, which is
particularly useful for more complex conditions:\preformatted{if (input$x < 0 && input$choice == "positive") \{
particularly useful for more complex conditions:
\if{html}{\out{<div class="sourceCode">}}\preformatted{if (input$x < 0 && input$choice == "positive") \{
validate("If choice is positive then x must be greater than 0")
\}
}
}\if{html}{\out{</div>}}
}
\examples{

View File

@@ -76,10 +76,10 @@ value when it is a single choice input and the empty string is not in the
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:nse-force]{rlang::!!()}}. For example,
used with rlang's \code{\link[rlang:injection-operator]{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:nse-force]{rlang::!!!()}} to expand
should be used with rlang's \code{\link[rlang:splice-operator]{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)]])}.

View File

@@ -33,7 +33,9 @@ shinyApp(ui, server = function(input, output) { })
\seealso{
Other layout functions:
\code{\link{fillPage}()},
\code{\link{fixedPage}()},
\code{\link{flowLayout}()},
\code{\link{fluidPage}()},
\code{\link{navbarPage}()},
\code{\link{sidebarLayout}()},
\code{\link{splitLayout}()}

View File

@@ -3,7 +3,7 @@
"homepage": "https://shiny.rstudio.com",
"repository": "github:rstudio/shiny",
"name": "@types/rstudio-shiny",
"version": "1.7.1-alpha.9002",
"version": "1.7.2-alpha.9000",
"license": "GPL-3.0-only",
"main": "",
"browser": "",
@@ -46,7 +46,8 @@
"@typescript-eslint/parser": "^4.25.0",
"autoprefixer": "^10.2.6",
"bootstrap-datepicker": "1.9.0",
"browserslist": "^4.16.6",
"browserslist": "^4.19.1",
"caniuse-lite": "^1.0.30001312",
"core-js": "^3.13.0",
"esbuild": "^0.12.4",
"esbuild-plugin-babel": "https://github.com/schloerke/esbuild-plugin-babel#patch-2",

View File

@@ -1,944 +1,12 @@
# Platform
|field |value |
|:--------|:----------------------------|
|version |R version 4.0.0 (2020-04-24) |
|os |macOS Catalina 10.15.5 |
|system |x86_64, darwin17.0 |
|ui |X11 |
|language |(EN) |
|collate |en_US.UTF-8 |
|ctype |en_US.UTF-8 |
|tz |America/New_York |
|date |2020-06-19 |
# Dependencies
|package |old |new |Δ |
|:-------|:-------|:-----|:--|
|shiny |1.4.0.2 |1.5.0 |* |
# Revdeps
## Failed to check (3)
## Failed to check (5)
|package |version |error |warning |note |
|:--------------------------------------|:-------|:-----|:-------|:----|
|[frailtypack](failures.md#frailtypack) |3.3.0 |1 | | |
|[Rariant](failures.md#rariant) |1.24.0 |1 | | |
|[skeleSim](failures.md#skelesim) |0.9.8 |1 | | |
## New problems (2)
|package |version |error |warning |note |
|:--------------------------------------------|:-------|:------|:-------|:--------|
|[bsplus](problems.md#bsplus) |0.1.1 |__+1__ | |1 |
|[RforProteomics](problems.md#rforproteomics) |1.26.0 | |1 |2 __+1__ |
## All (902)
|package |version |error |warning |note |
|:------------------------------------------------------------------------|:----------|:------|:-------|:--------|
|[aaSEA](problems.md#aasea) |1.1.0 | | |1 |
|ABACUS |1.0.0 | | | |
|abstractr |0.1.0 | | | |
|[ADAMgui](problems.md#adamgui) |1.4.0 | | |2 |
|[adapr](problems.md#adapr) |2.0.0 | | |1 |
|AdaptGauss |1.5.6 | | | |
|adaptiveGPCA |0.1.2 | | | |
|addinslist |0.3 | | | |
|addinsOutline |0.1.6 | | | |
|[adegenet](problems.md#adegenet) |2.1.3 | | |1 |
|[adepro](problems.md#adepro) |3.0.0 | | |1 |
|adespatial |0.3-8 | | | |
|[AdhereRViz](problems.md#adhererviz) |0.1.0 | | |1 |
|AFheritability |0.1.0 | | | |
|AFM |1.2.6 | | | |
|ahp |0.2.12 | | | |
|airGRteaching |0.2.8.69 | | | |
|[alevinQC](problems.md#alevinqc) |1.4.0 | | |1 |
|AMModels |0.1.4 | | | |
|AmpGram |1.0 | | | |
|[AMPLE](problems.md#ample) |0.0.2 | | |1 |
|AmyloGram |1.1 | | | |
|[analysisPipelines](problems.md#analysispipelines) |1.0.2 | | |1 |
|[animalcules](problems.md#animalcules) |1.4.0 |-1 | |4 |
|[animaltracker](problems.md#animaltracker) |0.1.0 | | |1 |
|[animint2](problems.md#animint2) |2019.7.3 |2 | |2 |
|aniview |0.1.0 | | | |
|[ANOVAIREVA](problems.md#anovaireva) |0.1.0 | | |1 |
|ANOVAreplication |1.1.4 | | | |
|[ANOVAShiny](problems.md#anovashiny) |0.1.0 | | |1 |
|antaresRead |2.2.5 | | | |
|antaresViz |0.15.2 | | | |
|AnthropMMD |3.0.1 | | | |
|[antitrust](problems.md#antitrust) |0.99.11 | | |1 |
|aos |0.1.0 | | | |
|[apexcharter](problems.md#apexcharter) |0.1.4 | | |1 |
|[appreci8R](problems.md#appreci8r) |1.6.0 |1 | | |
|[ArchaeoPhases](problems.md#archaeophases) |1.4.5 | | |1 |
|archivist |2.3.4 | | | |
|[arena2r](problems.md#arena2r) |1.0.0 | | |1 |
|argonDash |0.2.0 | | | |
|argonR |0.2.0 | | | |
|ARPobservation |1.2.0 | | | |
|arulesViz |1.3-3 | | | |
|asciiSetupReader |2.3.1 | | | |
|[ASSOCShiny](problems.md#assocshiny) |0.1.0 | | |1 |
|[AUCell](problems.md#aucell) |1.10.0 | | |4 |
|auth0 |0.2.1 | | | |
|AutoDeskR |0.1.3 | | | |
|autoshiny |0.0.2 | | | |
|[autoTS](problems.md#autots) |0.9.11 | | |1 |
|AzureAuth |1.2.4 | | | |
|azuremlsdk |0.6.85 | | | |
|backpipe |0.2.3 | | | |
|bairt |0.1.2 | | | |
|baRcodeR |0.1.5 | | | |
|[BARIS](problems.md#baris) |1.1.1 | | |1 |
|basictabler |0.3.1 | | | |
|[BatchQC](problems.md#batchqc) |1.16.0 |1 | |1 |
|[BayesBD](problems.md#bayesbd) |1.2 |1 | | |
|BayesianFROC |0.2.3 | | | |
|[BayesianNetwork](problems.md#bayesiannetwork) |0.1.5 | | |1 |
|[BayesNetBP](problems.md#bayesnetbp) |1.5.2 | | |1 |
|[BBEST](problems.md#bbest) |0.1-6 |1 | | |
|[BCEA](problems.md#bcea) |2.3-1.1 | | |1 |
|[bdchecks](problems.md#bdchecks) |0.1.7 | | |1 |
|[bdclean](problems.md#bdclean) |0.1.15 | | |1 |
|bdDwC |0.1.15 | | | |
|[bde](problems.md#bde) |1.0.1 | | |1 |
|BDEsize |1.2 | | | |
|BDP2 |0.1.3 | | | |
|[bea.R](problems.md#bear) |1.0.6 | | |1 |
|BEACH |1.3.1 | | | |
|[beanz](problems.md#beanz) |2.4 | | |3 |
|beats |0.1.1 | | | |
|[bestSDP](problems.md#bestsdp) |0.1.2 | | |1 |
|[BETS](problems.md#bets) |0.4.9 | |2 |1 |
|[bibliometrix](problems.md#bibliometrix) |3.0.2 | | |1 |
|BIGL |1.4.3 | | | |
|[bigPint](problems.md#bigpint) |1.4.0 | | |1 |
|[bigQueryR](problems.md#bigqueryr) |0.5.0 | | |1 |
|[billboarder](problems.md#billboarder) |0.2.8 | | |1 |
|[binovisualfields](problems.md#binovisualfields) |0.1.1 | | |1 |
|[bioCancer](problems.md#biocancer) |1.16.0 | |1 |2 |
|[BiocOncoTK](problems.md#bioconcotk) |1.8.0 |1 | |3 |
|[BioInstaller](problems.md#bioinstaller) |0.3.7 | | |1 |
|[BioNetStat](problems.md#bionetstat) |1.8.4 | | |4 |
|[BIRDS](problems.md#birds) |0.1 | | |2 |
|[biva](problems.md#biva) |0.1.0 | | |1 |
|[blkbox](problems.md#blkbox) |1.0 | | |2 |
|[blockCV](problems.md#blockcv) |2.1.1 | | |1 |
|blogdown |0.19 | | | |
|[BLRShiny](problems.md#blrshiny) |0.1.0 | | |1 |
|bookdown |0.19 | | | |
|bpbounds |0.1.4 | | | |
|bridger2 |0.1.0 | | | |
|bs4Dash |0.5.0 | | | |
|bSims |0.2-1 | | | |
|[bsplus](problems.md#bsplus) |0.1.1 |__+1__ | |1 |
|bullwhipgame |0.1.0 | | | |
|bunchr |1.2.0 | | | |
|bupaR |0.4.4 | | | |
|[caffsim](problems.md#caffsim) |0.2.2 | | |1 |
|CamelUp |0.1.1 | | | |
|[canvasXpress](problems.md#canvasxpress) |1.27.6-1 | | |1 |
|[CaPO4Sim](problems.md#capo4sim) |0.1.0 | | |1 |
|[cartools](problems.md#cartools) |0.1.0 | | |1 |
|causaloptim |0.7.1 | | | |
|cbsodataR |0.4.1 | | | |
|[ChAMP](problems.md#champ) |2.18.2 |1 | | |
|ChannelAttributionApp |1.2 | | | |
|cheatR |1.2.1 | | | |
|[CHETAH](problems.md#chetah) |1.4.0 | | |2 |
|[chipPCR](problems.md#chippcr) |0.0.8-10 | | |1 |
|[chromoMap](problems.md#chromomap) |0.2 | | |1 |
|chromVAR |1.10.0 | | | |
|[cicerone](problems.md#cicerone) |1.0.1 | | |1 |
|Cite |0.1.0 | | | |
|citr |0.3.2 | | | |
|[cjoint](problems.md#cjoint) |2.1.0 | | |2 |
|CLME |2.0-12 | | | |
|[clustDRM](problems.md#clustdrm) |0.1-0 | | |1 |
|[CLUSTShiny](problems.md#clustshiny) |0.1.0 | | |1 |
|cmsaf |2.0.1 |-1 | | |
|[CMShiny](problems.md#cmshiny) |0.1.0 | | |1 |
|cNORM |1.2.3 | | | |
|[CNVPanelizer](problems.md#cnvpanelizer) |1.20.0 | | |1 |
|CNVScope |3.0.9 | | | |
|[cocktailApp](problems.md#cocktailapp) |0.2.1 | | |1 |
|[codebook](problems.md#codebook) |0.9.2 | | |2 |
|[cognitoR](problems.md#cognitor) |1.0.1 | | |1 |
|colocr |0.1.1 | | | |
|colorspace |1.4-1 | | | |
|colourpicker |1.0 | | | |
|compareGroups |4.4.1 | | | |
|[COMPASS](problems.md#compass) |1.26.0 | | |3 |
|[competitiontoolbox](problems.md#competitiontoolbox) |0.1.2 | | |1 |
|complexity |1.1.1 | | | |
|condformat |0.9.0 | | | |
|condir |0.1.2 | | | |
|condvis |0.5-1 | | | |
|condvis2 |0.1.0 | | | |
|[conflr](problems.md#conflr) |0.1.1 | | |1 |
|convertr |0.1 | | | |
|[CoRegNet](problems.md#coregnet) |1.26.0 | |1 |2 |
|[corporaexplorer](problems.md#corporaexplorer) |0.8.2 | | |1 |
|[cosinor](problems.md#cosinor) |1.1 | | |1 |
|countfitteR |1.0 | | | |
|[coveffectsplot](problems.md#coveffectsplot) |0.0.9 | | |1 |
|[CRANsearcher](problems.md#cransearcher) |1.0.0 | | |1 |
|[crawl](problems.md#crawl) |2.2.1 | | |1 |
|credsubs |1.1.0 | | | |
|[crispRdesignR](problems.md#crisprdesignr) |1.1.5 | | |1 |
|[crisprseekplus](problems.md#crisprseekplus) |1.14.0 | | |1 |
|cromwellDashboard |0.5.1 | | | |
|cronR |0.4.0 | | | |
|[CrossICC](problems.md#crossicc) |1.2.0 | | |1 |
|[crossmeta](problems.md#crossmeta) |1.14.0 | |1 |2 |
|crosstalk |1.1.0.1 | | | |
|crunchy |0.3.1 | | | |
|[CSUV](problems.md#csuv) |0.1.0 |1 | | |
|[CTAShiny](problems.md#ctashiny) |0.1.0 | | |1 |
|[ctsem](problems.md#ctsem) |3.2.1 | | |3 |
|ctsGE |1.14.0 | | | |
|[CTShiny](problems.md#ctshiny) |0.1.0 | | |1 |
|CTTinShiny |0.1.0 | | | |
|CTTShiny |0.1 | | | |
|cubeview |0.2.0 | | | |
|[CVE](problems.md#cve) |1.11.2 |1 |1 |2 |
|cydar |1.12.0 | | | |
|CytobankAPIstats |2.0 | | | |
|d3heatmap |0.6.1.2 | | | |
|[d3Tree](problems.md#d3tree) |0.2.0 | | |1 |
|daqapo |0.3.0 | | | |
|[datacheck](problems.md#datacheck) |1.2.2 | | |2 |
|[datadigest](problems.md#datadigest) |1.0.2 | | |1 |
|[dataesgobr](problems.md#dataesgobr) |1.0.0 | | |1 |
|datamaps |0.0.3 | | | |
|datasets.load |1.4.0 | | | |
|daterangepicker |0.1.0 | | | |
|dccvalidator |0.2.0 | | | |
|ddpcr |1.15 | | | |
|[debrowser](problems.md#debrowser) |1.16.1 | | |1 |
|deepdep |0.2.1 | | | |
|deisotoper |0.0.7 | | | |
|[delayed](problems.md#delayed) |0.3.0 | | |1 |
|demoShiny |0.1 | | | |
|[DEP](problems.md#dep) |1.10.0 | | |1 |
|[detzrcr](problems.md#detzrcr) |0.3.0 | | |1 |
|dextergui |0.2.2 | | | |
|diffr |0.1 | | | |
|dipsaus |0.0.7 | | | |
|[DiscoRhythm](problems.md#discorhythm) |1.4.0 | | |2 |
|discoveR |1.2.4 | | | |
|disk.frame |0.3.6 | | | |
|distcomp |1.1 | | | |
|distill |0.8 | | | |
|distreg.vis |1.7.0 | | | |
|Distributacalcul |0.2.2 | | | |
|[diveRsity](problems.md#diversity) |1.9.90 | | |1 |
|DIZutils |0.0.4 | | | |
|[DLMtool](problems.md#dlmtool) |5.4.5 | | |1 |
|dmdScheme |1.2 | | | |
|[Doscheda](problems.md#doscheda) |1.10.0 | | |1 |
|[dosedesignR](problems.md#dosedesignr) |0.2.4 | | |1 |
|dpcR |0.5 | | | |
|[dplyrAssist](problems.md#dplyrassist) |0.1.0 | | |1 |
|dqshiny |0.0.4 | | | |
|[dragon](problems.md#dragon) |0.2.1 | | |1 |
|dragulaR |0.3.1 | | | |
|DRomics |2.0-1 | | | |
|[dropR](problems.md#dropr) |0.1 | | |1 |
|DSAIDE |0.8.3 | | | |
|DSAIRM |0.8.2 | | | |
|DT |0.13 | | | |
|DTAT |0.3-4 | | | |
|[dtwclust](problems.md#dtwclust) |5.5.6 | | |1 |
|[DVHmetrics](problems.md#dvhmetrics) |0.3.10 | | |1 |
|[dynamichazard](problems.md#dynamichazard) |0.6.6 | | |1 |
|DynNom |5.0.1 | | | |
|Eagle |2.2 | | | |
|eAnalytics |0.1.4 | | | |
|easySdcTable |0.5.0 | | | |
|[EBImage](problems.md#ebimage) |4.30.0 | |1 |1 |
|ECharts2Shiny |0.2.13 | | | |
|echarts4r |0.3.2 | | | |
|edeaR |0.8.5 | | | |
|edgebundleR |0.1.4 | | | |
|editData |0.1.2 | | | |
|eechidna |1.4.0 | | | |
|eemR |1.0.1 | | | |
|EffectLiteR |0.4-4 | | | |
|[effectR](problems.md#effectr) |1.0.2 | | |1 |
|egor |0.20.06 | | | |
|einet |0.1.0 | | | |
|elaborator |1.0 | | | |
|[elementR](problems.md#elementr) |1.3.6 |1 | | |
|[embryogrowth](problems.md#embryogrowth) |7.6 | | |1 |
|[EML](problems.md#eml) |2.0.2 | | |1 |
|EMMAgeo |0.9.7 | | | |
|EMSaov |2.3 | | | |
|emuR |2.1.0 | | | |
|[ENCODExplorer](problems.md#encodexplorer) |2.14.0 | | |1 |
|[enviGCMS](problems.md#envigcms) |0.6.6 | | |1 |
|enviPick |1.5 | | | |
|[epicontacts](problems.md#epicontacts) |1.1.0 | | |1 |
|epimdr |0.6-5 | | | |
|EpiModel |1.8.0 | | | |
|[EpiSignalDetection](problems.md#episignaldetection) |0.1.1 | | |1 |
|[epivizrChart](problems.md#epivizrchart) |1.10.0 | | |2 |
|eq5d |0.7.1 | | | |
|[erma](problems.md#erma) |1.4.0 | | |2 |
|ERSA |0.1.1 | | | |
|eSDM |0.3.4 | | | |
|eseis |0.5.0 | | | |
|esquisse |0.3.0 | | | |
|EurosarcBayes |1.1 | | | |
|evaluator |0.4.2 | | | |
|EventDetectGUI |0.3.0 | | | |
|[EventStudy](problems.md#eventstudy) |0.36 | | |2 |
|evobiR |1.1 | | | |
|excelR |0.4.0 | | | |
|ExPanDaR |0.5.1 | | | |
|explor |0.3.6 | | | |
|explore |0.5.5 | | | |
|ExploreModelMatrix |1.0.1 | | | |
|[ezplot](problems.md#ezplot) |0.6.1 | | |1 |
|Factoshiny |2.2 | | | |
|fanplot |3.4.2 | | | |
|[farrell](problems.md#farrell) |0.2.0 | | |1 |
|[FastqCleaner](problems.md#fastqcleaner) |1.6.0 | | |2 |
|[FELLA](problems.md#fella) |1.8.0 |1 | |1 |
|findviews |0.1.3 | | | |
|fingertipsR |1.0.4 | | | |
|[firebase](problems.md#firebase) |0.1.0 | | |1 |
|[fitteR](problems.md#fitter) |0.1.0 | | |1 |
|[fitur](problems.md#fitur) |0.6.1 | | |1 |
|flacco |1.8 | | | |
|[flair](problems.md#flair) |0.0.2 | | |1 |
|flexdashboard |0.5.1.1 | | | |
|[flora](problems.md#flora) |0.3.4 | | |1 |
|[flowAI](problems.md#flowai) |1.18.2 | | |1 |
|[flowcatchR](problems.md#flowcatchr) |1.22.0 | | |2 |
|flowPloidy |1.14.0 | | | |
|formatR |1.7 | | | |
|formattable |0.2.0.1 | | | |
|[frailtypack](failures.md#frailtypack) |3.3.0 |1 | | |
|FreqProf |0.0.1 | | | |
|frequency |0.4.0 | | | |
|fresh |0.2.0 | | | |
|[FSK2R](problems.md#fsk2r) |0.1.1 |1 | | |
|[FunChIP](problems.md#funchip) |1.14.0 |1 | | |
|FuzzyR |2.3 | | | |
|G2Sd |2.1.5 | | | |
|[g3viz](problems.md#g3viz) |1.1.2 | | |1 |
|[GA4GHshiny](problems.md#ga4ghshiny) |1.10.0 |1 | |1 |
|[gamesGA](problems.md#gamesga) |1.1.3.7 | | |1 |
|[gastempt](problems.md#gastempt) |0.5.0 | | |3 |
|gazepath |1.3 | | | |
|[GDCRNATools](problems.md#gdcrnatools) |1.8.0 | | |3 |
|GDINA |2.8.0 | | | |
|genBaRcode |1.2.3 | | | |
|[genBart](problems.md#genbart) |1.0.1 | | |1 |
|[GeneNetworkBuilder](problems.md#genenetworkbuilder) |1.30.0 | | |1 |
|GeneralizedUmatrix |1.1.9 | | | |
|[GenEst](problems.md#genest) |1.4.4 | | |1 |
|[GeneTonic](problems.md#genetonic) |1.0.1 | | |2 |
|genogeographer |0.1.19 | | | |
|[GenomicScores](problems.md#genomicscores) |2.0.0 |1 | |4 |
|genTS |0.1.3 | | | |
|geodrawr |1.0.1 | | | |
|[GerminaR](problems.md#germinar) |1.4.2 | | |1 |
|gestate |1.4.0 | | | |
|getTBinR |0.7.1 | | | |
|gfonts |0.1.1 | | | |
|[ggedit](problems.md#ggedit) |0.3.1 | | |1 |
|[ggExtra](problems.md#ggextra) |0.9 | | |1 |
|ggiraph |0.7.0 | | | |
|[ggplotAssist](problems.md#ggplotassist) |0.1.3 | | |1 |
|ggplotgui |1.0.0 | | | |
|[ggquickeda](problems.md#ggquickeda) |0.1.6 | | |1 |
|ggraptR |1.2 | | | |
|ggThemeAssist |0.1.5 | | | |
|ggvis |0.4.5 | | | |
|gimmeTools |0.1 | | | |
|giphyr |0.2.0 | | | |
|gitgadget |0.5.2 | | | |
|gitlabr |1.1.6 | | | |
|gitlink |0.1.3 | | | |
|glmaag |0.0.6 | | | |
|GMCM |1.4 | | | |
|[gmDatabase](problems.md#gmdatabase) |0.5.0 | |2 |1 |
|[GmicR](problems.md#gmicr) |1.2.0 | | |3 |
|GMSE |0.6.0.4 | | | |
|[GOFShiny](problems.md#gofshiny) |0.1.0 | | |1 |
|golem |0.2.1 | | | |
|googleAnalyticsR |0.7.1 | | | |
|googleAuthR |1.3.0 | | | |
|googleCloudRunner |0.2.0 | | | |
|googleLanguageR |0.3.0 | | | |
|googleVis |0.6.5 | | | |
|googleway |2.7.1 | | | |
|[GPA](problems.md#gpa) |1.0.0 | | |1 |
|GPoM.FDLyapu |1.0 | | | |
|[gQTLstats](problems.md#gqtlstats) |1.20.0 | | |4 |
|gradientPickerD3 |0.1.0.0 | | | |
|[gravitas](problems.md#gravitas) |0.1.2 |2 | | |
|[gridsampler](problems.md#gridsampler) |0.6 | | |1 |
|[GSCA](problems.md#gsca) |2.17.0 | | |3 |
|GSVA |1.36.2 | | | |
|[gt](problems.md#gt) |0.2.1 | | |2 |
|guiplot |0.1.0 | | | |
|[gwdegree](problems.md#gwdegree) |0.1.1 | | |1 |
|GWSDAT |3.0.3 | | | |
|[HaDeX](problems.md#hadex) |1.2.1 | | |2 |
|HARtools |0.0.5 | | | |
|[hchinamap](problems.md#hchinamap) |0.1.0 | | |1 |
|HelpersMG |4.2 | | | |
|HH |3.1-40 | | | |
|[highcharter](problems.md#highcharter) |0.7.0 | | |1 |
|highlightHTML |0.2.5 | | | |
|hpackedbubble |0.1.0 | | | |
|hR |0.2.1 | | | |
|[HumanTranscriptomeCompendium](problems.md#humantranscriptomecompendium) |1.4.0 |2 | | |
|[hwordcloud](problems.md#hwordcloud) |0.1.0 | | |1 |
|iAdapt |0.1.0 | | | |
|iCellR |1.5.1 | | | |
|iCOBRA |1.16.0 | | | |
|ICSShiny |0.5 | | | |
|[ideal](problems.md#ideal) |1.12.1 | | |1 |
|[idefix](problems.md#idefix) |0.4.3 | | |1 |
|[idem](problems.md#idem) |5.0 | | |2 |
|ifaTools |0.21 | | | |
|igraphinshiny |0.1 | | | |
|iheatmapr |0.4.12 | | | |
|imagefluency |0.2.3 | | | |
|Imetagene |1.18.0 | | | |
|[immunarch](problems.md#immunarch) |0.6.5 | | |2 |
|IMP |1.1 | | | |
|ImportExport |1.1 | | | |
|[IMWatson](problems.md#imwatson) |0.5.0 | | |1 |
|[IncucyteDRC](problems.md#incucytedrc) |0.5.4 |1 | | |
|[INDperform](problems.md#indperform) |0.2.2 |2 | |1 |
|inferr |0.3.0 | | | |
|[inlabru](problems.md#inlabru) |2.1.13 | | |2 |
|[INSPEcT](problems.md#inspect) |1.18.0 | | |2 |
|[interactiveDisplay](problems.md#interactivedisplay) |1.26.0 | |1 |2 |
|interactiveDisplayBase |1.26.3 | | | |
|[interAdapt](problems.md#interadapt) |0.1 | | |2 |
|interimApp |0.0.1 | | | |
|[IOHanalyzer](problems.md#iohanalyzer) |0.1.3 | | |2 |
|ioncopy |2.1.1 | | | |
|ipc |0.1.3 | | | |
|ipumsr |0.4.4 | | | |
|irtDemo |0.1.4 | | | |
|IRTShiny |1.2 | | | |
|[iSEE](problems.md#isee) |2.0.0 |2 | |2 |
|[iSEEu](problems.md#iseeu) |1.0.1 |2 | | |
|[iSTATS](problems.md#istats) |1.4 | | |1 |
|[ivygapSE](problems.md#ivygapse) |1.10.0 | | |2 |
|JMbayes |0.8-85 | | | |
|JointNets |2.0.1 | | | |
|[jpmesh](problems.md#jpmesh) |1.2.1 | | |1 |
|[jpndistrict](problems.md#jpndistrict) |0.3.7 | | |1 |
|[jsmodule](problems.md#jsmodule) |1.0.8 | | |1 |
|KappaGUI |2.0.2 | | | |
|KCSKNNShiny |0.1.0 | | | |
|KCSNBShiny |0.1.0 | | | |
|kgc |1.0.0.2 | | | |
|kgschart |1.3.5 | | | |
|[KNNShiny](problems.md#knnshiny) |0.1.0 | | |1 |
|[kokudosuuchi](problems.md#kokudosuuchi) |0.4.2 | | |1 |
|[koRpus](problems.md#korpus) |0.11-5 | | |1 |
|lavaan.shiny |1.2 | | | |
|LBSPR |0.1.5 | | | |
|lcars |0.3.1 | | | |
|lcsm |0.1.1 | | | |
|LDAvis |0.3.2 | | | |
|leaflet |2.0.3 | | | |
|[leaflet.extras2](problems.md#leafletextras2) |1.0.0 | | |1 |
|leaflet.minicharts |0.6.0 | | | |
|learnr |0.10.1 | | | |
|[learnstats](problems.md#learnstats) |0.1.1 | | |1 |
|[levi](problems.md#levi) |1.6.0 | | |2 |
|lifelogr |0.1.0 | | | |
|lightsout |0.3 | | | |
|[likert](problems.md#likert) |1.3.5 | | |1 |
|lime |0.5.1 | | | |
|linguisticsdown |1.2.0 | | | |
|linkspotter |1.2.0 | | | |
|linpk |1.0 | | | |
|listviewer |3.0.0 | | | |
|[live](problems.md#live) |1.5.13 | | |1 |
|[lmviz](problems.md#lmviz) |0.1.2 | | |1 |
|manipulateWidget |0.10.1 | | | |
|[mapdeck](problems.md#mapdeck) |0.3.3 | | |1 |
|[mapedit](problems.md#mapedit) |0.6.0 | | |1 |
|markdownInput |0.1.2 | | | |
|matman |1.1.0 | | | |
|MAVIS |1.1.3 | | | |
|MazamaSpatialUtils |0.6.4 | | | |
|MCPModPack |0.2 |-1 | | |
|mcvis |1.0.4 | | | |
|[MDSPCAShiny](problems.md#mdspcashiny) |0.1.0 | | |1 |
|meltt |0.4.1 | | | |
|[memapp](problems.md#memapp) |2.13 | | |1 |
|[memery](problems.md#memery) |0.5.2 | | |1 |
|merTools |0.5.0 | | | |
|[meta4diag](problems.md#meta4diag) |2.0.8 | | |1 |
|MetaAnalyser |0.2.1 | | | |
|metamer |0.2.0 | | | |
|metathis |1.0.2 | | | |
|[MetCirc](problems.md#metcirc) |1.18.0 | | |2 |
|[MethylAid](problems.md#methylaid) |1.22.0 |2 | |1 |
|[methylGSA](problems.md#methylgsa) |1.6.1 | | |1 |
|metricsgraphics |0.9.0 | | | |
|[mgcViz](problems.md#mgcviz) |0.1.6 | | |1 |
|[microhaplot](problems.md#microhaplot) |1.0.1 | | |1 |
|microsamplingDesign |1.0.7 | | | |
|midas |1.0.1 | | | |
|MIMSunit |0.9.1 | | | |
|[miniMeta](problems.md#minimeta) |0.2 | | |1 |
|miniUI |0.1.1.1 | | | |
|[miRcomp](problems.md#mircomp) |1.18.0 | |1 | |
|mirt |1.32.1 | | | |
|mirtCAT |1.9.3 | | | |
|[MLDAShiny](problems.md#mldashiny) |0.1.0 | | |1 |
|mldr |0.4.3 | | | |
|[MLInterfaces](problems.md#mlinterfaces) |1.68.0 | | |5 |
|[mlr3shiny](problems.md#mlr3shiny) |0.1.1 | | |1 |
|[MLRShiny](problems.md#mlrshiny) |0.1.0 | | |1 |
|[MLRShiny2](problems.md#mlrshiny2) |0.1.0 | | |1 |
|mlxR |4.1.3 | | | |
|[MMDiff2](problems.md#mmdiff2) |1.16.0 | | |4 |
|[MNLR](problems.md#mnlr) |0.1.0 | | |1 |
|modest |0.3-1 | | | |
|MODIStsp |1.4.0 | | | |
|Mondrian |1.1.0 | | | |
|mplot |1.0.4 | | | |
|mrMLM.GUI |4.0 | | | |
|[MSEtool](problems.md#msetool) |1.6.0 | | |1 |
|[MSGFgui](problems.md#msgfgui) |1.22.0 |1 | | |
|[MSnbase](problems.md#msnbase) |2.14.2 | | |3 |
|MSstatsQCgui |1.8.0 | | | |
|[mstrio](problems.md#mstrio) |11.2.1 | | |1 |
|MtreeRing |1.4.2 | | | |
|[MuChPoint](problems.md#muchpoint) |0.6.1 | | |1 |
|multichull |1.0.0 | | | |
|mwaved |1.1.7 | | | |
|mwshiny |2.1.0 | | | |
|NACHO |1.0.1 | | | |
|[nbc4va](problems.md#nbc4va) |1.1 |1 | |1 |
|[NBShiny](problems.md#nbshiny) |0.1.0 | | |1 |
|[NBShiny2](problems.md#nbshiny2) |0.1.0 | | |1 |
|[NDP](problems.md#ndp) |0.1.0 | | |1 |
|[neo4r](problems.md#neo4r) |0.1.1 | | |1 |
|netCoin |1.1.25 | | | |
|netrankr |0.2.1 | | | |
|nlgeocoder |0.1.3 | | | |
|NNTbiomarker |0.29.11 | | | |
|normalr |1.0.0 | | | |
|nph |2.0 | | | |
|[nprcgenekeepr](problems.md#nprcgenekeepr) |1.0.3 | | |1 |
|npregfast |1.5.1 | | | |
|nse2r |0.1.2 | | | |
|objectremover |0.7.0 | | | |
|[oceanis](problems.md#oceanis) |1.7.3 | | |2 |
|[omicplotR](problems.md#omicplotr) |1.8.0 | | |2 |
|[oneSENSE](problems.md#onesense) |1.10.0 | |1 |1 |
|[ontoProc](problems.md#ontoproc) |1.10.0 |1 | |3 |
|[oolong](problems.md#oolong) |0.3.4 | | |1 |
|OpenImageR |1.1.7 | | | |
|[openmetrics](problems.md#openmetrics) |0.1.1 | | |1 |
|[openPrimeRui](problems.md#openprimerui) |1.10.0 | | |2 |
|[oppr](problems.md#oppr) |1.0.2 | | |1 |
|optimStrat |2.1 | | | |
|OWEA |0.1.1 | | | |
|[pairsD3](problems.md#pairsd3) |0.1.0 | | |1 |
|[PanVizGenerator](problems.md#panvizgenerator) |1.16.0 | | |1 |
|ParallelLogger |2.0.0 | | | |
|paramGUI |2.1.4 | | | |
|parcoords |1.0.0 | | | |
|[PathoStat](problems.md#pathostat) |1.14.0 | | |1 |
|pcadapt |4.3.3 | | | |
|[pcaExplorer](problems.md#pcaexplorer) |2.14.2 | | |2 |
|[pcFactorStan](problems.md#pcfactorstan) |1.5.1 | | |2 |
|PCRedux |1.0-6 | | | |
|pdfsearch |0.3.0 | | | |
|PDShiny |0.1.0 | | | |
|PELVIS |2.0.1 | | | |
|[pepStat](problems.md#pepstat) |1.22.0 | | |3 |
|periscope |0.4.10-1 | | | |
|[phenocamr](problems.md#phenocamr) |1.1.4 | | |1 |
|phenofit |0.2.7 | | | |
|phenology |7.3 | | | |
|phuse |0.2.2 | | | |
|PhyloProfile |1.2.5 | | | |
|[piano](problems.md#piano) |2.4.0 | | |2 |
|pipe.design |0.5.1 | | | |
|pipefittr |0.1.2 | | | |
|[pitchRx](problems.md#pitchrx) |1.8.2 | | |1 |
|PivotalR |0.1.18.3.1 | | | |
|[pivottabler](problems.md#pivottabler) |1.5.0 | | |1 |
|pixels |0.1.0 | | | |
|PKconverter |1.5 | | | |
|pkgsearch |3.0.2 | | | |
|plainview |0.1.0 | | | |
|[plethem](problems.md#plethem) |0.1.7 |1 | |1 |
|[plotGrouper](problems.md#plotgrouper) |1.6.0 | | |1 |
|[plotly](problems.md#plotly) |4.9.2.1 | | |1 |
|plotROC |2.2.1 | | | |
|plotSEMM |2.4 | | | |
|plsr |0.0.1 | | | |
|[pmd](problems.md#pmd) |0.1.9 | | |1 |
|[pogos](problems.md#pogos) |1.8.0 | | |1 |
|[polaroid](problems.md#polaroid) |0.0.1 | | |1 |
|[polmineR](problems.md#polminer) |0.8.0 | | |1 |
|PopED |0.5.0 | | | |
|poppr |2.8.6 | | | |
|populationPDXdesign |1.0.3 | | | |
|powdR |1.2.2 | | | |
|powerlmm |0.4.0 | | | |
|ppcSpatial |0.2.0 | | | |
|pqantimalarials |0.2 | | | |
|[precisely](problems.md#precisely) |0.1.0 | | |1 |
|[PrecisionTrialDrawer](problems.md#precisiontrialdrawer) |1.4.0 |1 | | |
|[predictoR](problems.md#predictor) |1.1.0 | | |1 |
|[PREPShiny](problems.md#prepshiny) |0.1.0 | | |1 |
|[primirTSS](problems.md#primirtss) |1.6.1 | |1 |1 |
|[prioritizr](problems.md#prioritizr) |5.0.1 | | |2 |
|ProbBayes |1.1 | | | |
|[PROBShiny](problems.md#probshiny) |0.1.0 | | |1 |
|[processanimateR](problems.md#processanimater) |1.0.3 | | |1 |
|processmapR |0.3.4 | | | |
|processmonitR |0.1.0 | | | |
|processR |0.2.3 | | | |
|profvis |0.3.6 | | | |
|progressr |0.6.0 | | | |
|ProjectionBasedClustering |1.1.1 | | | |
|pRolocGUI |1.22.0 | | | |
|Prostar |1.20.0 | | | |
|[psichomics](problems.md#psichomics) |1.14.1 | | |1 |
|PupilPre |0.6.2 | | | |
|pushbar |0.1.0 | | | |
|[pwrEWAS](problems.md#pwrewas) |1.2.0 |2 | | |
|[QCA](problems.md#qca) |3.8.2 | | |2 |
|qgam |1.3.2 | | | |
|[qlcData](problems.md#qlcdata) |0.2.1 | | |1 |
|[qqplotr](problems.md#qqplotr) |0.0.4 | | |1 |
|qqvases |1.0.0 | | | |
|QRAGadget |0.1.0 | | | |
|qrage |1.0 | | | |
|QTL.gCIMapping.GUI |2.1 | | | |
|[questionr](problems.md#questionr) |0.7.1 | | |2 |
|R.SamBada |0.1.2 | | | |
|r2d3 |0.2.3 | | | |
|[R3CPET](problems.md#r3cpet) |1.20.0 |1 | | |
|r4ss |1.36.1 | | | |
|rabi |1.0.2 | | | |
|radarchart |0.3.1 | | | |
|radiant |1.3.2 | | | |
|radiant.basics |1.3.4 | | | |
|radiant.data |1.3.9 | | | |
|radiant.design |1.3.5 | | | |
|radiant.model |1.3.10 | | | |
|radiant.multivariate |1.3.5 | | | |
|radix |0.6 | | | |
|[RagGrid](problems.md#raggrid) |0.2.0 | | |1 |
|rainette |0.1.1 | | | |
|[rAmCharts](problems.md#ramcharts) |2.1.13 | | |1 |
|rangeMapper |0.3-7 | | | |
|[rangeModelMetadata](problems.md#rangemodelmetadata) |0.1.3 | | |1 |
|RanglaPunjab |2.3.4 | | | |
|[rapbase](problems.md#rapbase) |1.10.0 | | |1 |
|[Rariant](failures.md#rariant) |1.24.0 |1 | | |
|rbin |0.2.0 | | | |
|rblt |0.2.4.5 | | | |
|[rcellminer](problems.md#rcellminer) |2.10.0 | |1 |3 |
|[rCGH](problems.md#rcgh) |1.18.0 | | |2 |
|rclipboard |0.1.2 | | | |
|rco |1.0.1 | | | |
|rcrossref |1.0.0 | | | |
|[Rcwl](problems.md#rcwl) |1.4.2 |1 |4 |5 |
|[rddapp](problems.md#rddapp) |1.2.1 |1 | |2 |
|RDML |1.0 | | | |
|reactable |0.2.0 | | | |
|reactlog |1.0.0 | | | |
|reactR |0.4.2 | | | |
|[recmap](problems.md#recmap) |1.0.7 | | |1 |
|[ReDaMoR](problems.md#redamor) |0.4.2 | | |1 |
|[RefNet](problems.md#refnet) |1.24.0 | |1 | |
|refund.shiny |0.3.0 | | | |
|regexSelect |1.0.0 | | | |
|[regressoR](problems.md#regressor) |1.1.8 | | |1 |
|Repliscope |1.1.0 | | | |
|repo |2.1.5 | | | |
|[ReportingTools](problems.md#reportingtools) |2.28.0 | | |1 |
|reprex |0.3.0 | | | |
|[reverseR](problems.md#reverser) |0.1 | | |1 |
|revtools |0.4.1 | | | |
|[RforProteomics](problems.md#rforproteomics) |1.26.0 | |1 |2 __+1__ |
|[Rfssa](problems.md#rfssa) |1.0.0 | | |1 |
|RGA |0.4.2 | | | |
|[rgl](problems.md#rgl) |0.100.54 | | |2 |
|[rhandsontable](problems.md#rhandsontable) |0.3.7 | | |1 |
|Rilostat |1.1 | | | |
|rintrojs |0.2.2 | | | |
|rivr |1.2-2 | | | |
|[RLumShiny](problems.md#rlumshiny) |0.2.2 | | |1 |
|[rmarkdown](problems.md#rmarkdown) |2.3 | | |1 |
|[rmd](problems.md#rmd) |0.1.5 | | |1 |
|[RnBeads](problems.md#rnbeads) |2.6.0 | | |7 |
|rnn |0.9.8 | | | |
|roadoi |0.6 | | | |
|robmed |0.7.0 | | | |
|[RobStatTM](problems.md#robstattm) |1.0.2 | | |1 |
|[rosr](problems.md#rosr) |0.0.10 | | |1 |
|rPackedBar |0.2.2 | | | |
|[rpostgisLT](problems.md#rpostgislt) |0.6.0 | | |1 |
|rpredictit |0.0.2 | | | |
|[Rqc](problems.md#rqc) |1.22.0 | | |2 |
|[RQuantLib](problems.md#rquantlib) |0.4.12 |2 |1 | |
|rrtable |0.2.1 | | | |
|[rrvgo](problems.md#rrvgo) |1.0.0 | | |3 |
|RSCAT |1.1.0 | | | |
|rsconnect |0.8.16 | | | |
|[rtimicropem](problems.md#rtimicropem) |1.4.0 | | |1 |
|rTRMui |1.26.0 | | | |
|[RtutoR](problems.md#rtutor) |1.2 | | |1 |
|rusk |0.1.1 | | | |
|ruv |0.9.7.1 | | | |
|rwalkr |0.5.2 | | | |
|[RxODE](problems.md#rxode) |0.9.2-0 | | |1 |
|sadists |0.2.3 | | | |
|[safetyGraphics](problems.md#safetygraphics) |1.1.0 | | |1 |
|samr |3.0 | | | |
|[sangerseqR](problems.md#sangerseqr) |1.24.0 | | |1 |
|sankeywheel |0.1.0 | | | |
|[santaR](problems.md#santar) |1.0 | | |1 |
|[SC3](problems.md#sc3) |1.16.0 | | |3 |
|scdhlm |0.3.2 | | | |
|schex |1.2.0 | | | |
|[scone](problems.md#scone) |1.12.0 | | |1 |
|sdcHierarchies |0.18.2 | | | |
|sdcMicro |5.5.1 | | | |
|[SDEFSR](problems.md#sdefsr) |0.7.21 | | |1 |
|sdm |1.0-89 | | | |
|[SEA](problems.md#sea) |1.0 | | |1 |
|searchConsoleR |0.4.0 | | | |
|seasonalview |0.3 | | | |
|semantic.dashboard |0.1.5 | | | |
|[semdrw](problems.md#semdrw) |0.1.0 | | |1 |
|[SemNeT](problems.md#semnet) |1.3.0 | | |2 |
|sen2r |1.3.6 | | | |
|[seqplots](problems.md#seqplots) |1.26.0 | | |4 |
|serieslcb |0.4.0 | | | |
|[sglr](problems.md#sglr) |0.7 | | |2 |
|SHELF |1.7.0 | | | |
|shiny.info |0.2.0 | | | |
|[shiny.router](problems.md#shinyrouter) |0.1.1 | | |1 |
|[shiny.semantic](problems.md#shinysemantic) |0.3.0 | | |1 |
|[shinyAce](problems.md#shinyace) |0.4.1 | | |1 |
|[shinyaframe](problems.md#shinyaframe) |1.0.1 | | |1 |
|shinyalert |1.1 | | | |
|shinyanimate |0.3.0 | | | |
|shinybootstrap2 |0.2.1 | | | |
|[shinybrms](problems.md#shinybrms) |1.1.0 | | |1 |
|[shinyBS](problems.md#shinybs) |0.61 | | |1 |
|shinybusy |0.2.0 | | | |
|shinycssloaders |0.3 | | | |
|shinycustomloader |0.9.0 | | | |
|shinydashboard |0.7.1 | | | |
|shinydashboardPlus |0.7.0 | | | |
|shinyDND |0.1.0 | | | |
|[shinyEffects](problems.md#shinyeffects) |0.1.0 | | |1 |
|shinyEventLogger |0.1.1 | | | |
|shinyFeedback |0.2.0 | | | |
|shinyFiles |0.8.0 | | | |
|shinyglide |0.1.2 | | | |
|shinyHeatmaply |0.2.0 | | | |
|[shinyhelper](problems.md#shinyhelper) |0.3.2 | | |1 |
|ShinyImage |0.1.0 | | | |
|[ShinyItemAnalysis](problems.md#shinyitemanalysis) |1.3.3 | | |2 |
|shinyjqui |0.3.3 | | | |
|[shinyjs](problems.md#shinyjs) |1.1 | | |1 |
|[shinyKGode](problems.md#shinykgode) |1.0.5 | | |1 |
|shinyKnobs |0.1.3 | | | |
|shinylogs |0.1.7 | | | |
|shinyLP |1.1.2 | | | |
|shinymanager |1.0.200 | | | |
|shinymaterial |1.1.0 | | | |
|shinyMatrix |0.3.0 | | | |
|[shinyMethyl](problems.md#shinymethyl) |1.24.0 |1 | | |
|shinyML |0.2.0 | | | |
|shinyMobile |0.7.0 | | | |
|shinyMolBio |0.2 | | | |
|shinyNotes |0.0.1 | | | |
|shinyobjects |0.1.0 | | | |
|[shinypanels](problems.md#shinypanels) |0.5.0 | | |1 |
|[shinyr](problems.md#shinyr) |0.2.6 | | |1 |
|[shinyrecap](problems.md#shinyrecap) |0.1.0 | | |1 |
|shinyrecipes |0.1.0 | | | |
|shinyreforms |0.0.1 | | | |
|shinyRGL |0.1.0 | | | |
|shinySearchbar |1.0.0 | | | |
|shinySIR |0.1.1 | | | |
|shinystan |2.5.0 | | | |
|[shinyTANDEM](problems.md#shinytandem) |1.26.0 |1 | | |
|shinytest |1.4.0 | | | |
|shinythemes |1.1.2 | | | |
|shinyTime |1.0.1 | | | |
|shinytoastr |2.1.1 | | | |
|shinyTree |0.2.7 | | | |
|shinyWidgets |0.5.3 | | | |
|shinyypr |0.0.2 | | | |
|shotGroups |0.7.5.1 | | | |
|[sigmajs](problems.md#sigmajs) |0.1.5 | | |1 |
|sigmaNet |1.1.0 | | | |
|signalHsmm |1.5 | | | |
|[SimDesign](problems.md#simdesign) |2.0.1 | | |1 |
|simglm |0.8.0 | | | |
|simPATHy |0.4 | | | |
|[simplevis](problems.md#simplevis) |1.3.0 | | |1 |
|simrel |2.0.2 | | | |
|sinew |0.3.8 | | | |
|SingleCaseES |0.4.3 | | | |
|[singleCellTK](problems.md#singlecelltk) |1.8.0 | | |3 |
|sistec |0.1.0 | | | |
|[skeleSim](failures.md#skelesim) |0.9.8 |1 | | |
|[skpr](problems.md#skpr) |0.64.2 | | |2 |
|SMITIDvisu |0.0.6 | | | |
|snahelper |1.1.0 | | | |
|snotelr |1.0.4 | | | |
|[soc.ca](problems.md#socca) |0.7.3 | | |1 |
|Sofi |0.16.4.8 | | | |
|[soilcarbon](problems.md#soilcarbon) |1.2.0 | | |2 |
|[sojourner](problems.md#sojourner) |1.2.1 |1 | | |
|solvebio |2.7.2 | | | |
|SOMbrero |1.3 | | | |
|sortable |0.4.2 | | | |
|[soundgen](problems.md#soundgen) |1.7.0 | | |1 |
|[SpaDES.addins](problems.md#spadesaddins) |0.1.2 | | |1 |
|Spaniel |1.2.0 | | | |
|spANOVA |0.99.2 | | | |
|[spant](problems.md#spant) |1.6.0 | | |1 |
|sparkline |2.0 | | | |
|[sparklyr](problems.md#sparklyr) |1.2.0 | | |1 |
|[sparkTable](problems.md#sparktable) |1.3.0 | | |1 |
|SpatialCPie |1.4.0 | | | |
|[SpatialEpiApp](problems.md#spatialepiapp) |0.3 | | |2 |
|[spatialLIBD](problems.md#spatiallibd) |1.0.0 |1 | |1 |
|[spectrolab](problems.md#spectrolab) |0.0.9 | | |1 |
|spinifex |0.2.0 | | | |
|SpNetPrep |1.1 | | | |
|spotGUI |0.2.1 | | | |
|SqlRender |1.6.6 | | | |
|squid |0.1.2 | | | |
|[SSDM](problems.md#ssdm) |0.2.8 | | |1 |
|[ssrch](problems.md#ssrch) |1.4.0 | | |2 |
|[sstModel](problems.md#sstmodel) |1.0.0 | | |1 |
|[STAT](problems.md#stat) |0.1.0 | | |1 |
|statnetWeb |0.5.5 | | | |
|statsr |0.2.0 | | | |
|[steemr](problems.md#steemr) |0.1.3 | | |1 |
|StereoMorph |1.6.3 | | | |
|stmgui |0.1.6 | | | |
|[stminsights](problems.md#stminsights) |0.3.0 | | |1 |
|[STMotif](problems.md#stmotif) |2.0.0 | | |1 |
|[strand](problems.md#strand) |0.1.3 | | |1 |
|StratigrapheR |1.1.0 | | | |
|[subscreen](problems.md#subscreen) |2.0.1 | | |1 |
|SubVis |2.0.2 | | | |
|swirlify |0.5.3 | | | |
|[tableHTML](problems.md#tablehtml) |2.0.0 | | |2 |
|[tablerDash](problems.md#tablerdash) |0.1.0 | | |1 |
|tabulizer |0.2.2 | | | |
|taipan |0.1.2 | | | |
|target |1.2.0 | | | |
|[TAShiny](problems.md#tashiny) |0.1.0 | | |1 |
|[TBSignatureProfiler](problems.md#tbsignatureprofiler) |1.0.0 | | |1 |
|[TCGAbiolinksGUI](problems.md#tcgabiolinksgui) |1.14.0 | | |3 |
|[TeachBayes](problems.md#teachbayes) |1.0 | |1 | |
|teachingApps |1.0.8 | | | |
|[tenXplore](problems.md#tenxplore) |1.10.0 | | |1 |
|[TestDesign](problems.md#testdesign) |1.0.2 | | |1 |
|[testextra](problems.md#testextra) |0.1.0.1 | | |1 |
|[texPreview](problems.md#texpreview) |1.4.4 | | |1 |
|[TFutils](problems.md#tfutils) |1.8.0 |1 |1 |4 |
|themetagenomics |1.0.2 | | | |
|threeBrain |0.1.7 | | | |
|[tidycells](problems.md#tidycells) |0.2.2 |2 | | |
|tidycwl |1.0.4 | | | |
|tidyvpc |1.0.0 | | | |
|tigerstats |0.3.2 | | | |
|[timeline](problems.md#timeline) |0.9 | | |2 |
|[TimerQuant](problems.md#timerquant) |1.18.0 | | |1 |
|[timeseriesdb](problems.md#timeseriesdb) |0.4.1 | | |1 |
|[timevis](problems.md#timevis) |0.5 | | |1 |
|tippy |0.0.1 | | | |
|tmap |3.0 | | | |
|[tmaptools](problems.md#tmaptools) |3.0 | | |1 |
|TnT |1.10.0 | | | |
|toxEval |1.1.0 | | | |
|[TR8](problems.md#tr8) |0.9.21 | | |1 |
|trackdem |0.5.2 | | | |
|[trackeRapp](problems.md#trackerapp) |1.1 | | |1 |
|trackr |0.10.6 | | | |
|trade |0.5.4 | | | |
|treemap |2.4-2 | | | |
|TreeSearch |0.4.1 | | | |
|[treespace](problems.md#treespace) |1.1.3.2 | | |1 |
|TreeTools |1.0.0 | | | |
|Trendy |1.10.0 | | | |
|tricolore |1.2.2 | | | |
|[TSCAN](problems.md#tscan) |1.26.0 | | |1 |
|tsviz |0.1.0 | | | |
|[ttestshiny](problems.md#ttestshiny) |0.1.0 | | |1 |
|[TVTB](problems.md#tvtb) |1.14.0 | | |1 |
|[twoddpcr](problems.md#twoddpcr) |1.12.0 | | |1 |
|[TxRegInfra](problems.md#txreginfra) |1.8.0 | | |5 |
|[ubiquity](problems.md#ubiquity) |1.0.1 | | |1 |
|[UCSCXenaShiny](problems.md#ucscxenashiny) |0.5.0 | | |2 |
|UCSCXenaTools |1.3.1 | | | |
|[Ularcirc](problems.md#ularcirc) |1.6.0 |1 | | |
|Umatrix |3.3 | | | |
|[ursa](problems.md#ursa) |3.8.20 | | |1 |
|[VariantFiltering](problems.md#variantfiltering) |1.24.0 |1 | |3 |
|[VarSelLCM](problems.md#varsellcm) |2.1.3 | | |1 |
|[vdiffr](problems.md#vdiffr) |0.3.2 | | |1 |
|vegawidget |0.3.1 | | | |
|vici |0.5.2 | | | |
|VineCopula |2.3.0 | | | |
|[viromeBrowser](problems.md#viromebrowser) |1.0.0 | | |1 |
|[visit](problems.md#visit) |2.1 | | |2 |
|[visNetwork](problems.md#visnetwork) |2.0.9 | | |1 |
|vistributions |0.1.1 | | | |
|visvow |0.9.0 | | | |
|voronoiTreemap |0.2.0 | | | |
|VOSONDash |0.5.4 | | | |
|vov |0.1.0 | | | |
|vtree |4.0.0 | | | |
|[VTShiny](problems.md#vtshiny) |0.1.0 | | |1 |
|VWPre |1.2.3 | | | |
|[waiter](problems.md#waiter) |0.1.0 | | |1 |
|[wallace](problems.md#wallace) |1.0.6.2 | | |1 |
|[webr](problems.md#webr) |0.1.5 | | |1 |
|webshot |0.5.2 | | | |
|weco |1.2 | | | |
|weightr |2.0.2 | | | |
|wilson |2.4.0 | | | |
|wiqid |0.3.0 | | | |
|[wiseR](problems.md#wiser) |1.0.1 | | |2 |
|workflowr |1.6.2 | | | |
|wppExplorer |2.3-4 | | | |
|[wTO](problems.md#wto) |1.6.3 | | |1 |
|xplorerr |0.1.1 | | | |
|[xROI](problems.md#xroi) |0.9.13 | |1 | |
|[ymlthis](problems.md#ymlthis) |0.1.2 | | |1 |
|yonder |0.2.0 | | | |
|[yuimaGUI](problems.md#yuimagui) |1.3.0 | | |1 |
|zooimage |5.5.2 | | | |
|zscorer |0.3.1 | | | |
|package |version |error |warning |note |
|:----------|:-------|:-----|:-------|:----|
|ctsem |3.6.0 |1 | | |
|diveR |? | | | |
|loon.shiny |? | | | |
|NA |? | | | |
|SSVS |? | | | |

15
revdep/cran.md Normal file
View File

@@ -0,0 +1,15 @@
## revdepcheck results
We checked 1039 reverse dependencies (1038 from CRAN + 1 from Bioconductor), comparing R CMD check results across CRAN and dev versions of this package.
* We saw 0 new problems
* We failed to check 4 packages
Issues with CRAN packages are summarised below.
### Failed to check
* ctsem (NA)
* diveR (NA)
* loon.shiny (NA)
* SSVS (NA)

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ yarn add https://github.com/rstudio/shiny\#v1.7.0
, matching the GitHub tag to your current the Shiny CRAN release (ex: `v1.7.0`). If you are asked to select a version of `@types/jquery`, please select the closest matching version.
This will provide a global type defintion of `Shiny`, let your IDE know that `window.Shiny` is of type `Shiny`, and declare a globally available variable `Shiny` within your project. You **should not** need to import anything. Similar to `jQuery`, it should _Just Work_<sup>TM</sup>.
This will provide a global type definition of `Shiny`, let your IDE know that `window.Shiny` is of type `Shiny`, and declare a globally available variable `Shiny` within your project. You **should not** need to import anything. Similar to `jQuery`, it should _Just Work_<sup>TM</sup>.
When loading your compiled file, it should be loaded after `shiny.js` is loaded. If you are using an `htmlDependency()` to add your code to the page, your script will automatically be loaded after has been loaded.
@@ -192,7 +192,7 @@ Both JavaScript files will produce a sourcemap (`**.js.map`) that the browser wi
### Exported types
`./extras/globalShiny.ts` contains global declarations to define `window.Shiny`, a globally available `Shiny` variable, and a globally available `Shiny` type. This file is in a parallel folder to `./src` to avoid `Shiny` from being globally accessable within the source code. However, this file is the default type defintion when the Type definitions are installed by external developers.
`./extras/globalShiny.ts` contains global declarations to define `window.Shiny`, a globally available `Shiny` variable, and a globally available `Shiny` type. This file is in a parallel folder to `./src` to avoid `Shiny` from being globally accessable within the source code. However, this file is the default type definition when the Type definitions are installed by external developers.
### GitHub Actions

View File

@@ -10,7 +10,7 @@ import babelPlugin from "esbuild-plugin-babel";
build({
bundle: true,
sourcemap: "inline",
sourcemap: true,
minify: true,
plugins: [babelPlugin()],
banner: banner,

View File

@@ -1,14 +1,13 @@
/* eslint-disable unicorn/filename-case */
let protocol = "ws:";
const protocol = (window.location.protocol === "https:") ? "wss:" : "ws:";
// Add trailing slash to path, if necessary, before appending "autoreload"
const defaultPath = window.location.pathname.replace(/\/?$/, "/") + "autoreload/";
const defaultUrl = `${protocol}//${window.location.host}${defaultPath}`;
if (window.location.protocol === "https:") protocol = "wss:";
let defaultPath = window.location.pathname;
if (!/\/$/.test(defaultPath)) defaultPath += "/";
defaultPath += "autoreload/";
const ws = new WebSocket(protocol + "//" + window.location.host + defaultPath);
// By default, use the defaultUrl. But if there's a data-ws-url attribute on our
// <script> tag, use that instead.
const wsUrl = document.currentScript.dataset.wsUrl || defaultUrl;
const ws = new WebSocket(wsUrl);
ws.onmessage = function (event) {
if (event.data === "autoreload") {

View File

@@ -22,7 +22,7 @@ class InputBinding {
return false;
el;
}
getValue(el: HTMLElement): unknown {
getValue(el: HTMLElement): any {
throw "Not implemented";
el; // unused var
}

View File

@@ -64,13 +64,33 @@ class SelectInputBinding extends InputBinding {
setValue(el: SelectHTMLElement, value: string): void {
if (!isSelectize(el)) {
$(el).val(value);
} else {
const selectize = this._selectize(el);
if (selectize) {
selectize.setValue(value);
}
return;
}
const selectize = this._selectize(el);
if (!selectize) return;
if (!selectize.settings.load) {
selectize.setValue(value);
return;
}
window.console.log("Querying server side value:", value);
const callbackFn = (res) => {
if (!res) return;
window.console.log("Received server side value:", res);
if (hasOwnProperty(res, "value")) {
selectize.setValue(res.value);
} else if (selectize.settings.maxItems === 1) {
// first item selected by default only for single-select
selectize.setValue(res[0].value);
}
};
// Server side filtering
selectize.clearOptions();
selectize.settings.load.apply(selectize, ["", callbackFn]);
}
getState(el: SelectHTMLElement): {
label: JQuery<HTMLElement>;

View File

@@ -6,11 +6,11 @@ import type { ErrorsMessageValue } from "../shiny/shinyapp";
interface ShinyEventCommon extends JQuery.Event {
name: string;
value: unknown;
el: HTMLElement;
el: HTMLElement | null;
}
interface ShinyEventInputChanged extends ShinyEventCommon {
value: unknown;
binding: InputBinding;
binding: InputBinding | null;
inputType: string;
priority: EventPriority;
}

View File

@@ -14,7 +14,7 @@ function createClickInfo(
mousedown: (e: JQuery.MouseDownEvent) => void;
dblclickIE8: (e: JQuery.DoubleClickEvent) => void;
} {
let clickTimer = null;
let clickTimer: ReturnType<typeof setTimeout> = null;
let pendingE: JQuery.MouseDownEvent = null; // A pending mousedown2 event
// Create a new event of type eventType (like 'mousedown2'), and trigger

View File

@@ -7,6 +7,7 @@ import type { BoundsCss, Bounds, BrushOpts } from "./createBrush";
import type { Offset } from "./findbox";
import type { Coordmap } from "./initCoordmap";
import type { Panel } from "./initPanelScales";
import type { InputRatePolicy } from "../inputPolicies";
// ----------------------------------------------------------
// Handler creators for click, hover, brush.
@@ -83,7 +84,7 @@ function createHoverHandler(
nullOutside
);
let hoverInfoSender: Debouncer | Throttler;
let hoverInfoSender: InputRatePolicy<typeof sendHoverInfo>;
if (delayType === "throttle")
hoverInfoSender = new Throttler(null, sendHoverInfo, delay);

View File

@@ -118,7 +118,7 @@ type Coordmap = {
inputId: string,
clip?: boolean,
nullOutside?: boolean
) => (e: JQuery.MouseDownEvent) => void;
) => (e: JQuery.MouseDownEvent | JQuery.MouseMoveEvent) => void;
};
// This adds functions to the coordmap object to handle various

View File

@@ -5,8 +5,9 @@ import { InputRateDecorator } from "./inputRateDecorator";
import { InputDeferDecorator } from "./inputDeferDecorator";
import { InputValidateDecorator } from "./inputValidateDecorator";
import { InputPolicy } from "./inputPolicy";
import type { InputPolicy } from "./inputPolicy";
import type { EventPriority } from "./inputPolicy";
import type { InputRatePolicy } from "./inputRatePolicy";
export {
InputBatchSender,
@@ -15,7 +16,6 @@ export {
InputRateDecorator,
InputDeferDecorator,
InputValidateDecorator,
InputPolicy,
};
export type { EventPriority };
export type { InputPolicy, EventPriority, InputRatePolicy };

View File

@@ -1,27 +1,21 @@
import $ from "jquery";
import type { EventPriority } from "./inputPolicy";
import { InputPolicy } from "./inputPolicy";
import type { InputPolicy, InputPolicyOpts } from "./inputPolicy";
import type { ShinyApp } from "../shiny/shinyapp";
// Schedules data to be sent to shinyapp at the next setTimeout(0).
// Batches multiple input calls into one websocket message.
class InputBatchSender extends InputPolicy {
class InputBatchSender implements InputPolicy {
target!: InputPolicy; // We need this field to satisfy the InputPolicy interface
shinyapp: ShinyApp;
timerId: NodeJS.Timeout = null;
timerId: ReturnType<typeof setTimeout> | null = null;
pendingData: { [key: string]: unknown } = {};
reentrant = false;
lastChanceCallback: Array<() => void> = [];
constructor(shinyapp: ShinyApp) {
super();
this.shinyapp = shinyapp;
}
setInput(
nameType: string,
value: unknown,
opts: { priority: EventPriority }
): void {
setInput(nameType: string, value: unknown, opts: InputPolicyOpts): void {
this.pendingData[nameType] = value;
if (!this.reentrant) {
@@ -41,9 +35,7 @@ class InputBatchSender extends InputPolicy {
this.reentrant = true;
try {
this.timerId = null;
$.each(this.lastChanceCallback, (i, callback) => {
callback();
});
this.lastChanceCallback.forEach((callback) => callback());
const currentData = this.pendingData;
this.pendingData = {};

View File

@@ -1,21 +1,18 @@
import type { EventPriority } from "./inputPolicy";
import { InputPolicy } from "./inputPolicy";
import type { InputPolicy, InputPolicyOpts } from "./inputPolicy";
import { hasOwnProperty } from "../utils";
class InputDeferDecorator extends InputPolicy {
class InputDeferDecorator implements InputPolicy {
pendingInput: {
[key: string]: { value: unknown; opts: { priority: EventPriority } };
} = {};
target: InputPolicy;
constructor(target: InputPolicy) {
super();
this.target = target;
}
setInput(
nameType: string,
value: unknown,
opts: { priority: EventPriority }
): void {
setInput(nameType: string, value: unknown, opts: InputPolicyOpts): void {
if (/^\./.test(nameType)) this.target.setInput(nameType, value, opts);
else this.pendingInput[nameType] = { value, opts };
}

View File

@@ -1,25 +1,16 @@
import $ from "jquery";
import type { EventPriority } from "./inputPolicy";
import { InputPolicy } from "./inputPolicy";
import type { InputBinding } from "../bindings";
import type { InputPolicy, InputPolicyOpts } from "./inputPolicy";
import type { ShinyEventInputChanged } from "../events/shinyEvents";
import { splitInputNameType } from "./splitInputNameType";
class InputEventDecorator extends InputPolicy {
class InputEventDecorator implements InputPolicy {
target: InputPolicy;
constructor(target: InputPolicy) {
super();
this.target = target;
}
setInput(
nameType: string,
value: unknown,
opts: {
el: HTMLElement;
priority: EventPriority;
binding: InputBinding;
}
): void {
setInput(nameType: string, value: unknown, opts: InputPolicyOpts): void {
const evt = jQuery.Event("shiny:inputchanged") as ShinyEventInputChanged;
const input = splitInputNameType(nameType);
@@ -27,11 +18,15 @@ class InputEventDecorator extends InputPolicy {
evt.name = input.name;
evt.inputType = input.inputType;
evt.value = value;
evt.binding = opts.binding;
evt.el = opts.el;
evt.binding = opts.binding || null;
evt.el = opts.el || null;
evt.priority = opts.priority;
$(opts.el).trigger(evt);
// The `shiny:inputchanged` JavaScript event now triggers on the related
// input element instead of `document`. Existing event listeners bound to
// `document` will still detect the event due to event bubbling. #2446
// If no `el` exists, use `document` instead. #3584
$(opts.el || window.document).trigger(evt);
if (!evt.isDefaultPrevented()) {
let name = evt.name;

View File

@@ -1,24 +1,19 @@
import type { EventPriority } from "./inputPolicy";
import { InputPolicy } from "./inputPolicy";
import type { InputPolicy, InputPolicyOpts } from "./inputPolicy";
import { hasOwnProperty } from "../utils";
import { splitInputNameType } from "./splitInputNameType";
type LastSentValues = { [key: string]: { [key: string]: string } };
class InputNoResendDecorator extends InputPolicy {
lastSentValues: LastSentValues;
class InputNoResendDecorator implements InputPolicy {
target: InputPolicy;
lastSentValues: LastSentValues = {};
constructor(target: InputPolicy, initialValues: LastSentValues = {}) {
super();
this.target = target;
this.reset(initialValues);
}
setInput(
nameType: string,
value: unknown,
opts: { priority: EventPriority }
): void {
setInput(nameType: string, value: unknown, opts: InputPolicyOpts): void {
const { name: inputName, inputType: inputType } =
splitInputNameType(nameType);
const jsonValue = JSON.stringify(value);
@@ -34,13 +29,15 @@ class InputNoResendDecorator extends InputPolicy {
this.lastSentValues[inputName] = { jsonValue, inputType };
this.target.setInput(nameType, value, opts);
}
reset(values = {}): void {
reset(values: LastSentValues = {}): void {
// Given an object with flat name-value format:
// { x: "abc", "y.shiny.number": 123 }
// Create an object in cache format and save it:
// { x: { jsonValue: '"abc"', inputType: "" },
// y: { jsonValue: "123", inputType: "shiny.number" } }
const cacheValues = {};
const cacheValues: {
[key: string]: { jsonValue: string; inputType: string };
} = {};
for (const inputName in values) {
if (hasOwnProperty(values, inputName)) {

View File

@@ -1,21 +1,19 @@
import type { InputBinding } from "../bindings";
type EventPriority = "deferred" | "event" | "immediate";
type InputPolicyOpts = {
priority: EventPriority;
el?: HTMLElement;
binding?: InputBinding;
};
// Schedules data to be sent to shinyapp at the next setTimeout(0).
// Batches multiple input calls into one websocket message.
class InputPolicy {
interface InputPolicy {
target: InputPolicy;
setInput(
name: string,
value: unknown,
opts: { priority: EventPriority }
): void {
throw "not implemented";
name;
value;
opts;
}
setInput(name: string, value: unknown, opts: InputPolicyOpts): void;
}
export { InputPolicy };
export type { EventPriority };
export type { InputPolicy, EventPriority, InputPolicyOpts };

View File

@@ -1,14 +1,17 @@
import type { EventPriority } from "./inputPolicy";
import { InputPolicy } from "./inputPolicy";
import type { InputPolicy, InputPolicyOpts } from "./inputPolicy";
import { Debouncer, Invoker, Throttler } from "../time";
import { splitInputNameType } from "./splitInputNameType";
import type { InputRatePolicy } from "./inputRatePolicy";
type RatePolicyModes = "debounce" | "direct" | "throttle";
class InputRateDecorator extends InputPolicy {
inputRatePolicies = {};
class InputRateDecorator implements InputPolicy {
target: InputPolicy;
inputRatePolicies: {
[key: string]: InputRatePolicy<InputRateDecorator["_doSetInput"]>;
} = {};
constructor(target: InputPolicy) {
super();
this.target = target;
}
@@ -18,11 +21,7 @@ class InputRateDecorator extends InputPolicy {
// However, $ensureInit() and $doSetInput() are meant to be passed just
// the input name (i.e., inputId), which is why we distinguish between
// nameType and name.
setInput(
nameType: string,
value: unknown,
opts: { priority: EventPriority }
): void {
setInput(nameType: string, value: unknown, opts: InputPolicyOpts): void {
const { name: inputName } = splitInputNameType(nameType);
this._ensureInit(inputName);
@@ -60,7 +59,7 @@ class InputRateDecorator extends InputPolicy {
private _doSetInput(
nameType: string,
value: unknown,
opts: { priority: EventPriority }
opts: InputPolicyOpts
): void {
this.target.setInput(nameType, value, opts);
}

Some files were not shown because too many files have changed in this diff Show More