Lee88
Lee88

Reputation: 1295

multiple users changing reactive values in R shiny

Is it possible for multiple users of the same app to make changes to the same set of reactive values?

This question (handling multiple users simulaneously in an R Shiny app) suggests that multiple users in different sessions can make changes to the same value (by declaring it outside of server() and using <<- instead of <- ) But that is for just plain old values/variables. Is this possible for reactive values?

Ideally, I would like a change made by user A to be immediately reflected in some output viewed by user B.

Upvotes: 9

Views: 824

Answers (1)

MrGumble
MrGumble

Reputation: 5776

Here's a minimal working example based on RStudio's default one-file Shiny app:

library(shiny)

slidervalue <- 30

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Application title
    titlePanel("Old Faithful Geyser Data"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            sliderInput("bins",
                        "Number of bins:",
                        min = 1,
                        max = 50,
                        value = slidervalue)
        ),

        # Show a plot of the generated distribution
        mainPanel(
           plotOutput("distPlot"),
           textOutput('txt')
        )
    )
)

# Define server logic required to draw a histogram
server <- function(input, output, session) {

    observe({
        slidervalue <<- input$bins
    })

    reactive_slidervalue <- reactivePoll(100, session, 
        checkFunc = function() { slidervalue },
        valueFunc = function() { slidervalue }
    )

    output$txt <- renderText(reactive_slidervalue())

    observe({
        updateSliderInput(session, 'bins', value = reactive_slidervalue())
    })

    output$distPlot <- renderPlot({
        # generate bins based on input$bins from ui.R
        x    <- faithful[, 2]
        bins <- seq(min(x), max(x), length.out = reactive_slidervalue() + 1)

        # draw the histogram with the specified number of bins
        hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

Basically, I am using a global variable (as you and and the post suggested), and then hooked it back into server by using the reactivePoll function to make the external dependency reactive.

Upvotes: 5

Related Questions