繁体   English   中英

使用 shinyWidgets::updateVirtualSelect() 保存和加载输入导致 Shiny 应用程序崩溃

[英]Save and load input using shinyWidgets::updateVirtualSelect() lead Shiny app to crash

我正在尝试将shinyWidgets::virtualSelectInput()保存到 csv,然后加载 csv 文件并使用shinyWidgets::updateVirtualSelect().

更具体地说,我希望用户选择输入,将输入写入具有用户指定名称的 csv 文件,然后选择保存文件并加载保存在其中的输入。

但是,我收到以下错误:

警告:if 中的错误:参数的长度为零。 [没有可用的堆栈跟踪]

应用程序崩溃。

这是一个使用 LETTERS 的可重现的简单示例:

ui <- shiny::fluidPage(
  
  shinyWidgets::virtualSelectInput(
            inputId = "letters",
            label = "Letters",
            choices = NULL,
            selected = NULL,
            multiple = TRUE,
            search = T,
            placeholder = "Select Letters"
            
          ),
  shiny::inputPanel(
            shiny::textInput(
              inputId = "savefilename",
              label = "File Name",
              placeholder = "Name to save file"),
            shiny::actionButton(
              "saveFile", "Save"
            ),
            shiny::selectInput(
              'selectfile','Select File',
              choice = list.files(pattern = ".csv")
            ),
            shiny::actionButton(
              "loadFile","Load",
            )
            
          ),
  
)




server <- function(input,output,session){
  
    observe(
    {
      shinyWidgets::updateVirtualSelect(
        session = session,
        inputId = "letters",
        label = "Letters",
        choices = LETTERS
      )
      
    }
  )
  
  # Save File
  
  observeEvent(
    input$saveFile, 
    {
      LETTERS_table = tibble("LETTERS_picked" = input$letters) %>% 
        write_csv(file = paste(paste(input$savefilename,"_.csv",sep = ""),sep = ""))
      updateSelectInput(
        session = session,
        inputId = "selectfile",
        choices = list.files(pattern = ".csv")
      )
      
      
    }
  )
  
  
  
  
    # Load File
  
  observeEvent(
    input$loadFile, 
    {
      LETTERS_table = read_csv(file = input$selectfile)
      shinyWidgets::updateVirtualSelect(
        session,
        inputId = "letters",
        choices = LETTERS,
        selected = as.character(na.omit(LETTERS_table$LETTERS_picked))
      )

    }
  )
  
  
}


shinyApp(ui, server)

出于技术原因 - 我不能使用shinyWidgets::pickerInput

这是怎么回事? 我该如何解决这个问题? 谢谢。

请参阅?updateVirtualSelect

updateVirtualSelect(
  inputId,
  label = NULL,
  choices = NULL,
  selected = NULL,
  disable = NULL,
  session = shiny::getDefaultReactiveDomain()
)

您需要确保遵守 function arguments 的顺序或传递名为 arguments 的顺序。 在上面的代码中,您将session作为第一个未命名参数传递 - 应该是inputId

library(shiny)
library(shinyWidgets)
library(readr)
library(tibble)

ui <- shiny::fluidPage(
  shinyWidgets::virtualSelectInput(
    inputId = "letters",
    label = "Letters",
    choices = NULL,
    selected = NULL,
    multiple = TRUE,
    search = T,
    placeholder = "Select Letters"
  ),
  shiny::inputPanel(
    shiny::textInput(
      inputId = "savefilename",
      label = "File Name",
      placeholder = "Name to save file"
    ),
    shiny::actionButton("saveFile", "Save", style = "margin-top: 25px"),
    shiny::selectInput('selectfile', 'Select File', choice = list.files(pattern = ".csv")),
    shiny::actionButton("loadFile", "Load", style = "margin-top: 25px")
  )
)

server <- function(input, output, session) {
  
  shinyWidgets::updateVirtualSelect(
    session = session,
    inputId = "letters",
    label = "Letters",
    choices = LETTERS
  )
  
  # Save File
  observeEvent(input$saveFile,
               {
                 req(input$letters)
                 LETTERS_table = tibble("LETTERS_picked" = input$letters) %>%
                   write_csv(file = paste(paste(input$savefilename, "_.csv", sep = ""), sep = ""))
                 updateSelectInput(
                   session = session,
                   inputId = "selectfile",
                   choices = list.files(pattern = ".csv")
                 )
               })
  
  # Load File
  observeEvent(input$loadFile,
               {
                 LETTERS_table = read_csv(file = input$selectfile)
                 req(NROW(LETTERS_table) > 0)
                 shinyWidgets::updateVirtualSelect(
                   inputId = "letters",
                   choices = LETTERS,
                   selected = as.character(na.omit(LETTERS_table$LETTERS_picked)),
                   session = session
                 )
               })
}

shinyApp(ui, server)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM