R Shiny - 我的观察函数 ({UpdateSelectInput}) 有什么问题?

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

我已经针对我的问题查看了类似的帖子,但没有任何帮助,我 运行 失去了耐心。

我有一个非常简单的应用程序,我试图在其中找到 selected 美国州内的所有县。我在 UI 中使用 SelectInput 让用户 select 他们想要的状态,并在服务器中使用 UpdateSelectInput 以便用户可以 select 他们想要从他们的状态 selection.

这是我的简化数据的样子:

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

我的代码如下所示:

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)
)

最后,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) 

基本上我的第一个SelectInput就可以了,你可以选择任何你想要的状态。但是第二个 selector 是空白的!为什么。 我的观察功能有问题,但我一直坐在这里,没有可能的解决方案。 如果可以的话请帮忙!谢谢!

observe() 函数的目的是观察反应式表达式的变化。但是,updateSelectInput() 不是您所写的 reactive 表达式,因为其中的 none 表达式涉及任何反应值或表达式。

相反,您应该 observe() 更改输入的值,例如,像这样:

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")
 }
})

observe 中的表达式现在是反应式的,因为 input 是反应式的。

有关精彩讨论,请参阅

而不是 observe,尝试使用 observeEvent

还有一个错别字,input$STATE_NAME应该是input$selectstate

下面是一个最小的工作示例:

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)

天哪,我傻了。

这是因为我在观察事件中输入错误的名称。

成功了。答案:

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