R Shiny - What is the problem with my observe function ({UpdateSelectInput})?

|▌冷眼眸甩不掉的悲伤 提交于 2020-12-15 07:16:32

问题


I've looked on similar posts for my problem, but nothing is helping and I'm running out of patience.

I have a very simple app, where I'm trying to find all counties within a selected US state. I'm using SelectInput in the UI for users to select what state they want, and an UpdateSelectInput in the server so users can select what county they want from their state selection.

This is what my simplified data looks like:

**STATE_NAME      NAMELSAD**
Alabama            Clay County  
Alabama            Marengo County
Arkansas           Scott County

My code looks like this:

global.r

library(shiny)
library(leaflet)
library(sp)
library(rgdal)
library(htmltools)
library(DT)
library(ggplot2)
library(shinythemes)

path <- "C:/Users/user/Desktop/Countyapp/Countyapp/test_covid/"
setwd(path)

counties <- read.csv("us_counties1.csv")

UI.r

ui <- fluidPage(
        selectInput(inputId = "selectstate", label = "Select State", choices = (counties$STATE_NAME)),
        selectInput(inputId = "selectcounty", label =  "Select County", choices = NULL)
)

And finally, the server.R

server <- function(session, input, output) {

    observe({
        updateSelectInput(session, "selectcounty", "Select County", 
                          choices = counties$NAMELSAD[counties$STATE_NAME==input$STATE_NAME])
    })

}

shinyApp(ui = ui, server = [enter image description here][1]server) 

Basically, my first SelectInput works, you can choose whatever state you want. But the second selector is blank! Whyyyyyyy. There is something wrong with my observe function, but I've been sitting here forever and am out of possible solutions. Please help if you can! Thank you!


回答1:


Gosh, I'm stupid.

It's because I named the input wrong in my observe event.

got it working. Answer:

  observe({
        updateSelectInput(session, "selectcounty", "Select County", 
                          choices = counties$NAMELSAD[counties$STATE_NAME==input$selectstate])
    })



回答2:


Instead of observe, try using observeEvent

There is also a typo, where input$STATE_NAME should be input$selectstate

Below is a minimal working example:

library(shiny)

#Create your dataframe (runs once when app starts)
counties <- data.frame(
    STATE_NAME = c('Alabama', 'Alabama', 'Arkansas'),
    NAMELSAD   = c('Clay County', 'Marengo County', 'Scott County'),
    stringsAsFactors = FALSE
)

#UI
ui <- fluidPage(

    selectInput(inputId = "selectstate",  label = "Select State",  choices = (counties$STATE_NAME)),
    selectInput(inputId = "selectcounty", label = "Select County", choices = NULL)

)

#Server
server <- function(input, output, session) {

    #Runs when input$selectstate changes
    observeEvent(input$selectstate, {

        updateSelectInput(session, inputId = "selectcounty", label = "Select County", choices = counties[counties$STATE_NAME == input$selectstate,]$NAMELSAD)

    })

}

shinyApp(ui, server)



回答3:


The purpose of the observe() function is to watch for a change in a reactive expression. However, updateSelectInput() is not a reactive expression as you have written it, because none of the expressions within it involve any reactive values or expressions.

Instead, you should observe() an input's value for changes, for example, like this:

observe({
 if(input$selectstate != ""){
 updateSelectInput(session, "selectcounty", "Select County", 
                          choices = counties$NAMELSAD[counties$STATE_NAME==input$selectstate,])
 }
else {
 updateSelectInput(session, "selectcounty", "Select County", 
                          choices = "Select State")
 }
})

The expression in observe is now reactive because input is reactive.

See this answer for an excellent discussion.



来源:https://stackoverflow.com/questions/62293044/r-shiny-what-is-the-problem-with-my-observe-function-updateselectinput

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!