[英]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.