R Shiny - 我的观察函数(UpdateSelectInput)有啥问题?

Posted

技术标签:

【中文标题】R Shiny - 我的观察函数(UpdateSelectInput)有啥问题?【英文标题】:R Shiny - What is the problem with my observe function (UpdateSelectInput)?R Shiny - 我的观察函数(UpdateSelectInput)有什么问题? 【发布时间】:2020-09-29 05:55:32 【问题描述】:

我查看过类似的帖子来解决我的问题,但没有任何帮助,而且我已经没有耐心了。

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

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

**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 工作,你可以选择任何你想要的状态。但是第二个选择器是空白的!为什么。 我的观察功能有问题,但我一直坐在这里,没有可能的解决方案。 如果可以的话请帮忙!谢谢!

【问题讨论】:

您的selectInput for state 有一个inputId of selectstate --- 所以要引用这个输入,您需要input$selectstate...尝试在您的服务器中将其更改为:@987654330 @ 看看是否可行... 【参考方案1】:

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

相反,您应该 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 是响应式的。

请参阅this answer 进行精彩讨论。

【讨论】:

【参考方案2】:

请尝试使用observeEvent,而不是observe

还有一个错字,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)

【讨论】:

非常感谢。发布后我才意识到我的错误!就这么一个小错误我花了 5 个小时!【参考方案3】:

天哪,我很愚蠢。

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

让它工作。答:

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

【讨论】:

以上是关于R Shiny - 我的观察函数(UpdateSelectInput)有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

将函数连接到 R Shiny Dashboard 中的 actionButton

在 R/Shiny 中将输出组件设置为空

错误:所有观察都在同一组中,同时从闪亮的 ui 列表中动态过滤 R 模型

运行 R Shiny 应用程序时如何在数据表函数中编辑列名?

R Shiny:如何从数据表中的自定义按钮调用 JavaScript 函数

Shiny App:从上传的文件中获取输入选择