Sets up a shiny::ExtendedTask to relay its state to an existing
input_task_button(), so the task button stays in its "busy" state for as
long as the extended task is running.
Note that bind_task_button does not automatically cause button presses to
invoke the extended task; you still need to use shiny::bindEvent() (or
shiny::observeEvent()) to cause the button press to trigger an invocation,
as in the example below.
bind_task_button cannot be used to bind one task button to multiple
ExtendedTask objects; if you attempt to do so, any bound ExtendedTask
that completes will cause the button to return to "ready" state.
Usage
bind_task_button(target, task_button_id, ...)
# Default S3 method
bind_task_button(target, task_button_id, ...)
# S3 method for class 'ExtendedTask'
bind_task_button(target, task_button_id, ..., session = get_current_session())Arguments
- target
The target object (i.e.
ExtendedTask).A string matching the
idargument passed to the correspondinginput_task_button()call.- ...
Further arguments passed to other methods.
- session
A Shiny session object (the default should almost always be used).
Examples
if (FALSE) { # rlang::is_interactive()
library(shiny)
library(bslib)
library(future)
plan(multisession)
ui <- page_sidebar(
sidebar = sidebar(
input_task_button("recalc", "Recalculate")
),
textOutput("outval")
)
server <- function(input, output) {
rand_task <- ExtendedTask$new(function() {
future({
# Slow operation goes here
Sys.sleep(2)
runif(1)
}, seed = TRUE)
})
# Make button state reflect task.
# If using R >=4.1, you can do this instead:
# rand_task <- ExtendedTask$new(...) |> bind_task_button("recalc")
bind_task_button(rand_task, "recalc")
observeEvent(input$recalc, {
rand_task$invoke()
})
output$outval <- renderText({
rand_task$result()
})
}
shinyApp(ui, server)
}
