R Shiny updateSelectizeInput выдает ошибку и не обновляет - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь создать два раскрывающихся списка в блестящем - один список состояний, который затем фильтрует второй раскрывающийся список, в котором перечислены все округа для выбранного состояния. Следующий код работает, НО округа не обновляются при изменении состояний.

UI

pageWithSidebar(
 headerPanel("My chart"),
 sidebarPanel(
  uiOutput("sel_state"),
  uiOutput("sel_county")
 ),
 mainPanel(
  tableOutput("table")
 )
)

Сервер

function(input, output, session) {

  output$sel_state <- renderUI({
   selectizeInput('state', 'Select a State', choices=c("Choose One" = "", state_list))
  })

  output$sel_county <- renderUI({
   county_list <- reactive({
    df %>%
     filter(state == input$state) %>%
     pull(county) %>%
     sort() %>%
     as.character()
   })
    selectizeInput('county', 'Select a County', choices=c("Choose One" = "", county_list()))
  })

  tab <- reactive({
   df %>%
    filter(state == input$state) %>%
    filter(county == input$county)
  })

  output$table <- renderTable({
   tab()
  })
 }

Я попытался заменить 'selectizeInput' в округ выпадает со следующим «updateSelectizeInput», но продолжает выдавать следующую ошибку

Новая строка сервера

updateSelectizeInput(session, 'county', 'Select a County', choices=c("Choose One" = "", county_list()))

ОШИБКА: невозможно привести тип «среда» к вектору типа «символ»

Код для создания фреймов данных - список округов еще не является правильным списком

    x <- getURL("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv")
    csv <- read.csv(text=x)
    df <- as.data.frame(csv)
    state_list <- c(levels(df$state))
    county_list <- subset(df, select = c(3,2))

dput output

dput(head(cl))
structure(list(state = c("Washington", "Washington", "Washington", 
"Illinois", "Washington", "California"), county = c("Snohomish", 
"Snohomish", "Snohomish", "Cook", "Snohomish", "Orange")), row.names = 
c(NA, 6L), class = "data.frame")

1 Ответ

0 голосов
/ 07 апреля 2020

У меня нет информации о вашем штате / округе (или ее структуре), но этот небольшой пример завершает то, что, я думаю, вы описываете. На заметку:

Сначала необходимо выбрать элемент пользовательского интерфейса select с помощью selectizeInput, а затем обновить его содержимое с помощью updateSelectizeInput. Таким образом, вам нужны обе функции, но для этого небольшого репрезента я создал updateSelectizeInput, хотя, возможно, поэтому я мог неправильно истолковать то, что вы хотите сделать.

В этом примере округ selectInput получает реактивный объект поскольку его выбор вводится на основе подстановки списка округов выбором состояния пользователя, поэтому вход выбора округа будет обновляться, когда пользователь переключается между состояниями.

Я также обернул вход округа условной панелью - этот ввод будет только показать, выбрал ли пользователь состояние с состоянием selectInput.

UPDATE * добавить 'req (length (input $ state)> 0)', чтобы реактив не выполнялся на сервере, пока не выбрано состояние

library(shiny)
library(tidyverse)

ui <- fluidPage(


    pageWithSidebar(
        headerPanel("My chart"),
        sidebarPanel(
            uiOutput("sel_state"),
            conditionalPanel(condition = "input.state.length > 0",

            uiOutput("sel_county")
            )
        ),
        mainPanel(

        )
    )
)


server <- function(input, output) {

    #create example of data structure
   df <- structure(list(state = c("Washington", "Washington", "Washington", 
                         "Illinois", "Washington", "California"), county = c("Snohomish", 
                                                                             "Snohomish", "Snohomish", "Cook", "Snohomish", "Orange")), row.names = 
              c(NA, 6L), class = "data.frame")
   #pull out unique state names
    state_list <- as.character(unique(df$state))

    #filter for counties only in desired state and pull column to vector 
    selected_state_counties <- reactive({
    req(length(input$state) > 0)
        df %>% 
            filter(state == input$state) %>% 
            pull(county) %>% 
            as.character()

    })

output$sel_state <- renderUI({
        selectizeInput('state', 'Select a State', choices=c("Choose One" = "", state_list))
    })

output$sel_county <- renderUI({
        selectizeInput('county', 'Select a County', choices=c("Choose One" = "", selected_state_counties()))
    })


}

# Run the application 
shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...