Ujjawal Bhandari
Ujjawal Bhandari

Reputation: 1372

Access reactive created in observe

I am trying to access reactive created in observe( ) and want as returned object from the module. In the example below, I am looking for mydf() and input$account_page from the module. I understand I can show modal using observeEvent(input$go_to, { }) but I have other usecase to do this way which it's difficult for me to create reproducible example for that. Hence I created the below for specified problem.

library(shiny)
library(shinyWidgets)

choiceVec <- c("Beef/Pork" = "beefpork","Sugar sweeteened bev." = "ssb",
               "Total fruit" = "total_fruit")

address_ui <- function(id) { }

address_server <- function(id, signin =  reactive(0)) {
  moduleServer(id, function(input, output, session) {
    
    observe({
      
      shiny::showModal(
        
        shiny::modalDialog(
          
          fluidRow(
            
            column(
              width = 6,
              
              shiny::textInput(
                "state",
                "State",
                width = "100%", 
                placeholder = "California"
              )),
            
            column(
              width = 6,
              
              shinyWidgets::pickerInput(
                "country",
                "Country",
                choices = choiceVec, 
                width = "100%", 
                # selected = "us",
                options = list(
                  title = "Select Country",
                  `live-search` = TRUE)
              )
            )),
          
          title = "Address",
          footer = tags$span(
            shiny::actionButton(
              'account_page',
              'Next'
            )
          ),
          size = 'm'
        )
      )
      
      
      mydf <- reactive({
        
        list(
             state = input$state,
             country = input$country
        )
        
      })
      
      
    })
    
    return( list(mydf(), reactive({ input$account_page }) ))
    
  })
  
  }
    
      

ui <- fluidPage(
  actionLink(
    "go_to",
    "Click Me",
    icon = icon("credit-card")
  ),
  address_ui("user_info")
)

server <- function(input, output, session) {
  
  user_details_return <- address_server(
    id = "user_info",
    signin = 1
  )
  
  
}

shinyApp(ui, server)

Upvotes: 1

Views: 43

Answers (1)

YBS
YBS

Reputation: 21349

Reactive object mydf() is available only inside the observer. Try this

library(shiny)
library(shinyWidgets)

choiceVec <- c("Beef/Pork" = "beefpork","Sugar sweeteened bev." = "ssb",
               "Total fruit" = "total_fruit")

address_ui <- function(id) {ns <- NS(id) 
                            verbatimTextOutput(ns("t1")) }

address_server <- function(id, signin =  reactive(0)) {
  moduleServer(id, function(input, output, session) {
    ns <- session$ns
    observe({
      
      shiny::showModal(
        
        shiny::modalDialog(
          
          fluidRow(
            
            column(
              width = 6,
              
              shiny::textInput(
                ns("state"),
                "State",
                width = "100%", 
                placeholder = "California"
              )),
            
            column(
              width = 6,
              
              shinyWidgets::pickerInput(
                ns("country"),
                "Country",
                choices = choiceVec, 
                width = "100%", 
                # selected = "us",
                options = list(
                  title = "Select Country",
                  `live-search` = TRUE)
              )
            )),
          
          title = "Address",
          footer = tags$span(
            shiny::actionButton(
              ns('account_page'),
              'Next'
            )
          ),
          size = 'm'
        )
      )
      
      
      mydf <- reactive({
        
        list(
          state = input$state,
          country = input$country
        )
        
      })
      
      observeEvent(input$account_page, {
        removeModal()
        return( list(mydf(), reactive({ input$account_page }) ))
      })
        
      output$t1 <- renderPrint({
        mydf()
      })
    })
    
  })
  
}



ui <- fluidPage(
  actionLink(
    "go_to",
    "Click Me",
    icon = icon("credit-card")
  ),
  address_ui("user_info") 
)

server <- function(input, output, session) {
  
  user_details_return <- address_server(
    id = "user_info",
    signin = 1
  )
  
}

shinyApp(ui, server)

Please note that you don't need showModal to be inside an observer. You can just do

      observe({return( list(mydf(), reactive({ input$account_page }) )) })

      observeEvent(input$account_page, {
        removeModal()
      })

Upvotes: 1

Related Questions