# functions that will be used by modules
#' Turn 'RAVE' module auto-recalculate on or off
#' @param on logical or integer; see details
#' @details Used inside of 'RAVE' modules. By default modules are automatically
#' updated: that means if an input is updated, usually the module main function
#' will be executed and outputs will be rendered. However, if main body function
#' takes very long time to run, automatically recalculate module will result
#' in freeze shiny session. To solve the issue, module writers can choose
#' manually recalculate modules by turning off auto-recalculation.
#'
#' \code{on} can be logical or numerical. For logical values, either the
#' auto-recalculation is constantly on or off. For numerical, typically
#' integer values, on means temporary on for limited times. For example
#' \code{auto_recalculate(1)} means run main function for one time.
#'
#' To turn off auto-recalculation, call \code{auto_recalculate} within
#' \code{\link{define_initialization}} with \code{on=FALSE}. To temporary
#' turn on recalculation, use shiny \code{\link[shiny]{observeEvent}}
#' to capture an event and call \code{auto_recalculate(1)} once event is
#' triggered.
#'
#' @examples
#'
#' require(shiny)
#' # Turn on debug mode for example
#' rave_context('rave_module_debug')
#'
#' # In initialization
#' define_initialization({
#' auto_recalculate(FALSE)
#' # ..., other initialization code
#' })
#'
#' @export
auto_recalculate <- rave_context_generics(
'auto_recalculate', alist(on=)
)
#' @export
auto_recalculate.default <- function(on){
return(TRUE)
}
#' @export
auto_recalculate.rave_running <- function(on){
instance <- from_rave_context('instance')
if(!missing(on)){
if(isTRUE(on) || is.infinite(on)){
rave_info('[{instance$module_label}] Auto-recalculation is turned [ON]')
instance$auto_run = Inf
} else {
on = as.numeric(on)
if(on <= 0){
rave_info('[{instance$module_label}] Auto-recalculation is turned [OFF]')
instance$auto_run = on
} else if(instance$has_data){
rave_info('[{instance$module_label}] Auto-recalculation is temporary on for {on} time(s)')
instance$auto_run = on
} else {
# No data detected, no need to recalculate
instance$auto_run = 0
}
}
}
return(is.infinite(instance$auto_run))
}
#' Exit RAVE main function
#' @description Only works in RAVE \code{main.R} blocks
#' @return A signal instance
#' @export
exit_main <- function(){
cond <- simpleCondition('Main exited', call = NULL)
class(cond) <- c('raveExitMain', class(cond))
signalCondition(cond)
invisible(cond)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.