In order to run the shiny app in inst/shiny/consumer_example/app.R
you'll need to setup your
GCP_PROJECT
as an environment variable before running this example.
Run the app from the root of the package:
shiny::runApp("inst/shiny/consumer_example/")
Upon startup, the inst/shiny/consumer_example/app.Rinit.R
file will take care of creating the
following resources:
shiny-topic
shiny-sub
This app is composed by two main components:
A producer:
In this case, our producer will be an actionButton
(on top of this readme) that will trigger
a PubsubMessage
to be generated and sent to the subscription, the message will contain the following fields:
{ "col_a": "int", # A random integer "col_b": "int", # A random integer "fired_at": "str" # Timestamp at which the message was created }
A consumer:
This is the bulk of where the interesting things happen. The shiny app will check whether new
messages have been published to the subscription every 2 seconds. In order not to block the user from
sending new messages (or keep interacting with sliders, inputs, etc. in a more complex case), this will be
done in a parallel R session using the {promises}
and {future}
packages.
# Set up a message consumer in background sessions (poll messages every 2 seconds) observe({ invalidateLater(20000, session) future_promise({ pubsub_auth() # Authenticated session is not passed to futures' env get_data() }) %>% then(function(res) { # Notify the user if new messages have been received if (!is.null(res)) { showNotification( paste("Message received at", strftime(Sys.time()), sep = " "), duration = 3, type = "warning" ) } # Append to the reactive dataframe out_df$df <- rbind(out_df$df, res) }) # Hide the future, this is a fire and forget hack and allows avoid blocking # from https://stackoverflow.com/a/57922419/9046275 return(NULL) })
The get_data()
function takes care of:
The components described above interact according the behaviour described by the diagram below:
+---------------+ +---------------+ +------------------+ +--------------------+ | actionButton |-->| Pub/Sub Topic | |Observe({promise})|------> |Output dataframe | | (producer) | | | |(consumer) | |(reactiveValues(df) | +---------------+ +---------------+ +------------------+ +--------------------+ | ^ | +-----v---------+ | | |Pub/Sub |-----------+ | |Subscription |<----------------+ +---------------+
profviz
is capable to handle multi-session shiny apps).Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.