mirror of
https://github.com/rstudio/shiny.git
synced 2026-04-07 03:00:20 -04:00
brought observeEvent/eventReactive documentation up to date
This commit is contained in:
4
NEWS.md
4
NEWS.md
@@ -33,7 +33,9 @@ This is a significant release for Shiny, with a major new feature that was nearl
|
||||
|
||||
* [#1989](https://github.com/rstudio/shiny/issues/1989): The server side of outputs can now be removed (e.g. `output$plot <- NULL`). This is not usually necessary but it does allow some objects to be garbage collected, which might matter if you are dynamically creating and destroying many outputs. (Thanks, @mmuurr! [#2011](https://github.com/rstudio/shiny/pull/2011))
|
||||
|
||||
* Removed the (ridiculously outdated) "experimental feature" tag from the reference documentation for `renderUI`.
|
||||
* Removed the (ridiculously outdated) "experimental feature" tag from the reference documentation for `renderUI`. ([#2036](https://github.com/rstudio/shiny/pull/2036))
|
||||
|
||||
* Addressed [#1907](https://github.com/rstudio/shiny/issues/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](https://github.com/rstudio/shiny/pull/2036))
|
||||
|
||||
### Bug fixes
|
||||
|
||||
|
||||
@@ -1033,11 +1033,11 @@ Observer <- R6Class(
|
||||
# shiny.silent.error = function(e) NULL
|
||||
# validation = function(e) NULL,
|
||||
# shiny.output.cancel = function(e) NULL
|
||||
|
||||
|
||||
if (inherits(e, "shiny.silent.error")) {
|
||||
return()
|
||||
}
|
||||
|
||||
|
||||
printError(e)
|
||||
if (!is.null(.domain)) {
|
||||
.domain$unhandledError(e)
|
||||
@@ -1392,7 +1392,7 @@ reactiveTimer <- function(intervalMs=1000, session = getDefaultReactiveDomain())
|
||||
# Need to make sure that session is resolved at creation, not when the
|
||||
# callback below is fired (see #1621).
|
||||
force(session)
|
||||
|
||||
|
||||
dependents <- Map$new()
|
||||
timerHandle <- scheduleTask(intervalMs, function() {
|
||||
# Quit if the session is closed
|
||||
@@ -1496,11 +1496,11 @@ invalidateLater <- function(millis, session = getDefaultReactiveDomain()) {
|
||||
|
||||
invisible()
|
||||
})
|
||||
|
||||
|
||||
if (!is.null(session)) {
|
||||
session$onEnded(timerHandle)
|
||||
}
|
||||
|
||||
|
||||
invisible()
|
||||
}
|
||||
|
||||
@@ -1818,15 +1818,20 @@ maskReactiveContext <- function(expr) {
|
||||
#' the action/calculation and just let the user re-initiate it (like a
|
||||
#' "Recalculate" button).
|
||||
#'
|
||||
#' Unlike what happens for \code{ignoreNULL}, only \code{observeEvent} takes in an
|
||||
#' \code{ignoreInit} argument. By default, \code{observeEvent} will run right when
|
||||
#' it is created (except if, at that moment, \code{eventExpr} evaluates to \code{NULL}
|
||||
#' Likewise, both \code{observeEvent} and \code{eventReactive} also take in an
|
||||
#' \code{ignoreInit} argument. By default, both of these will run right when they
|
||||
#' are created (except if, at that moment, \code{eventExpr} evaluates to \code{NULL}
|
||||
#' and \code{ignoreNULL} is \code{TRUE}). But when responding to a click of an action
|
||||
#' button, it may often be useful to set \code{ignoreInit} to \code{TRUE}. For
|
||||
#' example, if you're setting up an \code{observeEvent} for a dynamically created
|
||||
#' button, then \code{ignoreInit = TRUE} will guarantee that the action (in
|
||||
#' \code{handlerExpr}) will only be triggered when the button is actually clicked,
|
||||
#' instead of also being triggered when it is created/initialized.
|
||||
#' instead of also being triggered when it is created/initialized. Similarly,
|
||||
#' if you're setting up an \code{eventReactive} that responds to a dynamically
|
||||
#' created button used to refresh some data (then returned by that \code{eventReactive}),
|
||||
#' then you should use \code{eventReactive([...], ignoreInit = TRUE)} if you want
|
||||
#' to let the user decide if/when they want to refresh the data (since, depending
|
||||
#' on the app, this may be a computationally expensive operation).
|
||||
#'
|
||||
#' Even though \code{ignoreNULL} and \code{ignoreInit} can be used for similar
|
||||
#' purposes they are independent from one another. Here's the result of combining
|
||||
@@ -1834,25 +1839,28 @@ maskReactiveContext <- function(expr) {
|
||||
#'
|
||||
#' \describe{
|
||||
#' \item{\code{ignoreNULL = TRUE} and \code{ignoreInit = FALSE}}{
|
||||
#' This is the default. This combination means that \code{handlerExpr} will
|
||||
#' run every time that \code{eventExpr} is not \code{NULL}. If, at the time
|
||||
#' of the \code{observeEvent}'s creation, \code{handleExpr} happens to
|
||||
#' \emph{not} be \code{NULL}, then the code runs.
|
||||
#' This is the default. This combination means that \code{handlerExpr}/
|
||||
#' \code{valueExpr} will run every time that \code{eventExpr} is not
|
||||
#' \code{NULL}. If, at the time of the creation of the
|
||||
#' \code{observeEvent}/\code{eventReactive}, \code{eventExpr} happens
|
||||
#' to \emph{not} be \code{NULL}, then the code runs.
|
||||
#' }
|
||||
#' \item{\code{ignoreNULL = FALSE} and \code{ignoreInit = FALSE}}{
|
||||
#' This combination means that \code{handlerExpr} will run every time no
|
||||
#' matter what.
|
||||
#' This combination means that \code{handlerExpr}/\code{valueExpr} will
|
||||
#' run every time no matter what.
|
||||
#' }
|
||||
#' \item{\code{ignoreNULL = FALSE} and \code{ignoreInit = TRUE}}{
|
||||
#' This combination means that \code{handlerExpr} will \emph{not} run when
|
||||
#' the \code{observeEvent} is created (because \code{ignoreInit = TRUE}),
|
||||
#' but it will run every other time.
|
||||
#' This combination means that \code{handlerExpr}/\code{valueExpr} will
|
||||
#' \emph{not} run when the \code{observeEvent}/\code{eventReactive} is
|
||||
#' created (because \code{ignoreInit = TRUE}), but it will run every
|
||||
#' other time.
|
||||
#' }
|
||||
#' \item{\code{ignoreNULL = TRUE} and \code{ignoreInit = TRUE}}{
|
||||
#' This combination means that \code{handlerExpr} will \emph{not} run when
|
||||
#' the \code{observeEvent} is created (because \code{ignoreInit = TRUE}).
|
||||
#' After that, \code{handlerExpr} will run every time that \code{eventExpr}
|
||||
#' is not \code{NULL}.
|
||||
#' This combination means that \code{handlerExpr}/\code{valueExpr} will
|
||||
#' \emph{not} run when the \code{observeEvent}/\code{eventReactive} is
|
||||
#' created (because \code{ignoreInit = TRUE}). After that,
|
||||
#' \code{handlerExpr}/\code{valueExpr} will run every time that
|
||||
#' \code{eventExpr} is not \code{NULL}.
|
||||
#' }
|
||||
#' }
|
||||
#'
|
||||
@@ -1999,7 +2007,7 @@ observeEvent <- function(eventExpr, handlerExpr,
|
||||
initialized <<- TRUE
|
||||
return()
|
||||
}
|
||||
|
||||
|
||||
if (ignoreNULL && isNullEvent(value)) {
|
||||
return()
|
||||
}
|
||||
@@ -2007,7 +2015,7 @@ observeEvent <- function(eventExpr, handlerExpr,
|
||||
if (once) {
|
||||
on.exit(o$destroy())
|
||||
}
|
||||
|
||||
|
||||
isolate(handlerFunc())
|
||||
}
|
||||
)
|
||||
@@ -2043,9 +2051,9 @@ eventReactive <- function(eventExpr, valueExpr,
|
||||
initialized <<- TRUE
|
||||
req(FALSE)
|
||||
}
|
||||
|
||||
|
||||
req(!ignoreNULL || !isNullEvent(value))
|
||||
|
||||
|
||||
isolate(handlerFunc())
|
||||
}
|
||||
)
|
||||
|
||||
@@ -135,15 +135,20 @@ whereas \code{ignoreNULL=FALSE} is desirable if you want to initially perform
|
||||
the action/calculation and just let the user re-initiate it (like a
|
||||
"Recalculate" button).
|
||||
|
||||
Unlike what happens for \code{ignoreNULL}, only \code{observeEvent} takes in an
|
||||
\code{ignoreInit} argument. By default, \code{observeEvent} will run right when
|
||||
it is created (except if, at that moment, \code{eventExpr} evaluates to \code{NULL}
|
||||
Likewise, both \code{observeEvent} and \code{eventReactive} also take in an
|
||||
\code{ignoreInit} argument. By default, both of these will run right when they
|
||||
are created (except if, at that moment, \code{eventExpr} evaluates to \code{NULL}
|
||||
and \code{ignoreNULL} is \code{TRUE}). But when responding to a click of an action
|
||||
button, it may often be useful to set \code{ignoreInit} to \code{TRUE}. For
|
||||
example, if you're setting up an \code{observeEvent} for a dynamically created
|
||||
button, then \code{ignoreInit = TRUE} will guarantee that the action (in
|
||||
\code{handlerExpr}) will only be triggered when the button is actually clicked,
|
||||
instead of also being triggered when it is created/initialized.
|
||||
instead of also being triggered when it is created/initialized. Similarly,
|
||||
if you're setting up an \code{eventReactive} that responds to a dynamically
|
||||
created button used to refresh some data (then returned by that \code{eventReactive}),
|
||||
then you should use \code{eventReactive([...], ignoreInit = TRUE)} if you want
|
||||
to let the user decide if/when they want to refresh the data (since, depending
|
||||
on the app, this may be a computationally expensive operation).
|
||||
|
||||
Even though \code{ignoreNULL} and \code{ignoreInit} can be used for similar
|
||||
purposes they are independent from one another. Here's the result of combining
|
||||
@@ -151,25 +156,28 @@ these:
|
||||
|
||||
\describe{
|
||||
\item{\code{ignoreNULL = TRUE} and \code{ignoreInit = FALSE}}{
|
||||
This is the default. This combination means that \code{handlerExpr} will
|
||||
run every time that \code{eventExpr} is not \code{NULL}. If, at the time
|
||||
of the \code{observeEvent}'s creation, \code{handleExpr} happens to
|
||||
\emph{not} be \code{NULL}, then the code runs.
|
||||
This is the default. This combination means that \code{handlerExpr}/
|
||||
\code{valueExpr} will run every time that \code{eventExpr} is not
|
||||
\code{NULL}. If, at the time of the creation of the
|
||||
\code{observeEvent}/\code{eventReactive}, \code{eventExpr} happens
|
||||
to \emph{not} be \code{NULL}, then the code runs.
|
||||
}
|
||||
\item{\code{ignoreNULL = FALSE} and \code{ignoreInit = FALSE}}{
|
||||
This combination means that \code{handlerExpr} will run every time no
|
||||
matter what.
|
||||
This combination means that \code{handlerExpr}/\code{valueExpr} will
|
||||
run every time no matter what.
|
||||
}
|
||||
\item{\code{ignoreNULL = FALSE} and \code{ignoreInit = TRUE}}{
|
||||
This combination means that \code{handlerExpr} will \emph{not} run when
|
||||
the \code{observeEvent} is created (because \code{ignoreInit = TRUE}),
|
||||
but it will run every other time.
|
||||
This combination means that \code{handlerExpr}/\code{valueExpr} will
|
||||
\emph{not} run when the \code{observeEvent}/\code{eventReactive} is
|
||||
created (because \code{ignoreInit = TRUE}), but it will run every
|
||||
other time.
|
||||
}
|
||||
\item{\code{ignoreNULL = TRUE} and \code{ignoreInit = TRUE}}{
|
||||
This combination means that \code{handlerExpr} will \emph{not} run when
|
||||
the \code{observeEvent} is created (because \code{ignoreInit = TRUE}).
|
||||
After that, \code{handlerExpr} will run every time that \code{eventExpr}
|
||||
is not \code{NULL}.
|
||||
This combination means that \code{handlerExpr}/\code{valueExpr} will
|
||||
\emph{not} run when the \code{observeEvent}/\code{eventReactive} is
|
||||
created (because \code{ignoreInit = TRUE}). After that,
|
||||
\code{handlerExpr}/\code{valueExpr} will run every time that
|
||||
\code{eventExpr} is not \code{NULL}.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user