在 selectInput() 中强制没有默认选择

Posted

技术标签:

【中文标题】在 selectInput() 中强制没有默认选择【英文标题】:Force no default selection in selectInput() 【发布时间】:2014-08-02 06:46:33 【问题描述】:

闪亮的documentation 提到selectInput()

selected 默认情况下应选择的导航项的值(或者,如果未提供,则为标题)。如果为 NULL,将选择第一个导航。

如果默认情况下我不想从选择列表中选择任何值怎么办?

实际上,我的选择值默认被选中,应用程序的其余部分会自动执行。但我最初不想选择任何值。我应该向selectInput() 中的selected 参数提供什么来做到这一点?


确实,我不希望自动选择任何内容。我使用了下面的代码,但它仍然从列表中选择第一个可用值。我希望默认情况下没有选择,因此用户可以选择任何选项。

output$Choose_App <- renderUI(
selectInput("app",
            "Select App:",
            choices = as.character(mtrl_name),
            selected = NULL ,
            multiple = FALSE
           )
        )

浏览documentation 我注意到只有当我选择multiple=TRUE 时,选择才能为空。它是否正确?

当我更改为multiple=TRUE 时,默认情况下它不会被选中,这正是我想要的。但不幸的是,在做出任何选择之前,我还会收到以下错误消息:

ERROR: bad 'file' argument 

如果我做错了什么,有人知道吗?但是如果我选择这个文件,那么错误就消失了。

我为此使用以下代码:

# server.R
setwd("/opt/shiny-server/samples/sample-apps/P-Dict_RDS2")
mtrl_name <- try(system("ls | grep -i .rds", intern = TRUE))

shinyServer(function(input, output) 

# First UI input (Service column) filter clientData 
output$Choose_Molecule <- renderUI(
selectInput("molecule",
            "Select Molecule:",
            choices = as.character(mtrl_name),
            selected = input$molecule,
            multiple = TRUE
           )
        )

【问题讨论】:

【参考方案1】:

您可以使用选择输入而不是选择输入,并使用一些自定义选择选项将初始选择设置为空。 An example 已在 Shiny Gallery 中提供。特别是,请参见示例 #6。

# make sure you have shiny >= 0.9.1
selectizeInput(
  'e6', '6. Placeholder', choices = state.name,
  options = list(
    placeholder = 'Please select an option below',
    onInitialize = I('function()  this.setValue(""); ')
  )
)

顺便说一句,对于错误"ERROR: bad 'file' argument",我认为没有人可以在不查看您的应用程序源代码的情况下为您提供帮助,这可能是一个单独的问题。

【讨论】:

【参考方案2】:

遇到了类似的问题。我找到的解决方案基于@MKa 的回答。如果您的代码无法处理多个值,您不想设置 multiple=T。我的建议是:

selectInput("molecule",
            "Select Molecule:",
            choices = c("",as.character(mtrl_name)),
            selected = NULL,
            multiple = F
           ) 

并检索选定的值:

if(!is.null(input$molecule))

  if(nchar(input$molecule)>1)
  
    #do your thing..
  

解决了我的问题。如果您找到更好的解决方案,请告诉我。

【讨论】:

【参考方案3】:

我认为你可以通过在你的选择列表中添加一个空字符串来解决它:

selectInput("app", 
"Select App:", 
choices = c("", as.character(mtrl_name)), 
selected = NULL, 
multiple = FALSE)

【讨论】:

【参考方案4】:

@Yihui Xie 的answer 需要selectInput(..., selectize = TRUE)。如果你想要selectize = FALSE,你仍然可以达到类似的效果,如下所示。

这不是documented:

selected 最初选择的值(如果multiple = TRUE,则为多个值)。如果未指定,则默认为单选列表的第一个值,多选列表没有值。

但是对于单选列表,如果您可以使用selectize = FALSE, size = 4(任何非NULL 大小都可以),那么您可以设置selected = FALSE 以强制不进行默认选择。

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(
      mainPanel(
         uiOutput("Choose_Molecule")
      )
)

# Define server logic required to draw a histogram
server <- function(input, output) 

    # First UI input (Service column) filter clientData 
    output$Choose_Molecule <- renderUI(
        selectInput("molecule",
                    "Select Molecule:",
                    choices = rownames(mtcars),
                    selected = FALSE,
                    multiple = FALSE
                    , selectize = FALSE, size = 4  ##needed for `selected = FALSE` to work
        )
    )



# Run the application 
shinyApp(ui = ui, server = server)

【讨论】:

【参考方案5】:

一种解决方法是使用updateSelectInput。这里的重点是您将selected = 参数设置为length(your_vector_with_choices)

如果您希望在开始时更新您的selectInput(在这种情况下仅在程序启动时观察到),您可以创建一个reactiveValues

library(shiny)

shinyApp(
  ui = fluidPage(
    selectInput("state", "Choose a state:", NULL),
    textOutput("result")
  ),
  
  server = function(input, output, session) 
    values <- reactiveValues(start = NULL)
    
    observe(
      choiceList <- list(`East Coast` = list("NY", "NJ", "CT"),
                         `West Coast` = list("WA", "OR", "CA"),
                         `Midwest` = list("MN", "WI", "IA"))
      updateSelectInput(session, "state", choices = choiceList, selected = choiceList[length(choiceList)])
    )
    
    output$result <- renderText(
      paste("You chose", input$state)
    )
  
)

【讨论】:

【参考方案6】:

6年后回答,因为我现在遇到了同样的错误。我们可以写 selected = character(0) 强制不选择任何用户输入。

【讨论】:

对于闪亮的 1.5.0 中的 selectInput,它对我不起作用【参考方案7】:

@rookieJoe 答案的修改是使用req() 而不是ifs。阅读 this page 以了解 req() 用法的介绍(在这个特定问题中,req() 将字符串 "" 视为“虚假”值)。

例如,如果selectInput 像他的:

selectInput("molecule",
            "Select Molecule:",
            choices = c("", as.character(mtrl_name)),
            selected = NULL,
            multiple = F
           ) 

在响应式中检索值:

my_reactive <- reactive(
req(input$molecule)
# do your stuff 
)

【讨论】:

【参考方案8】:

更简洁的解决方案是使用 selectizeInput,允许多选,但将最大选择数限制为 1。这意味着默认选择将为 NULL,用户只能选择 1 个选项,而您不必将一个空字符串添加到您之前在此处列出的选项或类似解决方法中。

selectizeInput(
"tag", 
"Label", 
choices = choices, 
multiple = TRUE, 
options = list(maxItems = 1)
) 

【讨论】:

以上是关于在 selectInput() 中强制没有默认选择的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 actionButton 更改 R Shiny 中 selectInput 上的选定值?

如何在 RMarkdown 中使用 Shiny 进行嵌套选择 selectInput()?

在闪亮的 R 中使用 selectInput 来选择和过滤行,而不是选择列

依赖于另一个 selectInput 的 selectInput

闪亮的 renderUI selectInput 返回 NULL

R Shiny - 如何在 selectInput 中显示选择标签