如何通过 div 标签要求在 R Shiny 中输入?

Posted

技术标签:

【中文标题】如何通过 div 标签要求在 R Shiny 中输入?【英文标题】:How to require inputs in R Shiny by div tag? 【发布时间】:2021-09-11 00:09:49 【问题描述】:

我有一个带有许多输入的 R Shiny 应用程序,在它运行输出之前,我想避免它显示输出,直到它具有所有必需的输入。但是,有很多输出,我不想将它们全部输入,而是通过它们的 div 标签(输入)使用 req() 调用。

这是一个简单的应用程序:

library(shiny)

ui <- fluidRow(
    column(12,
           div(id = "inputs",
        selectInput(inputId = "reasons",
                    label = "Select Your Reasons",
                    choices = c("Everything", "Your Hair", "Your Eyes", "Your Smile"),
                    multiple = TRUE),
        selectInput(inputId = "verb",
                    label = "Select Your Verb",
                    choices = c("love", "hate"),
                    multiple = TRUE)),
        textOutput("message")
    )
)

server <- function(input, output) 
    
    output$message <- renderText(
        paste("I", input$verb, input$reasons)
    )



shinyApp(ui = ui, server = server)

我尝试在 renderTextpaste 调用之间添加 shiny::req(input$inputs),但该代码没有显示任何内容,即使我为 2 个下拉菜单选择了值。

【问题讨论】:

isolate() 可能会有所帮助。您还可以通过observeEvent 让消息输出响应按钮单击。 我可以想出几种方法来实现这一点,但闪亮的模块似乎与您的设计相匹配。 @SmokeyShakers,我以前没听说过闪亮的模块。我将如何更新上述代码以将它们组合在一起? 【参考方案1】:

正如我所提到的,您可能会发现模块非常适合。但是,就我个人而言,我会选择一个中间反应来要求。

library(shiny)

ui <- fluidRow(
  column(12,
         div(id = "inputs",
             selectInput(inputId = "reasons",
                         label = "Select Your Reasons",
                         choices = c("Everything", "Your Hair", "Your Eyes", "Your Smile"),
                         multiple = TRUE),
             selectInput(inputId = "verb",
                         label = "Select Your Verb",
                         choices = c("love", "hate"),
                         multiple = TRUE)),
         textOutput("message")
  )
)

server <- function(input, output) 
  
  ## returns NULL if any of the listed inputs are null
  inputs <- reactive(
    input_list<- lapply(c('reasons','verb'), function(x) input[[x]])
    if(list(NULL) %in% input_list) NULL else input_list
  )
  
  
  output$message <- renderText(
    req(inputs())
    paste("I", input$verb, input$reasons)
  )
  


shinyApp(ui = ui, server = server)

【讨论】:

以上是关于如何通过 div 标签要求在 R Shiny 中输入?的主要内容,如果未能解决你的问题,请参考以下文章

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

R shiny ggplot - 如何不让年份标签超出网格?

从 SelectInput (R Shiny) 中的分组选项列表中获取组标签

R Shiny:如何更改表格的背景颜色

R Shiny - 获取单选按钮的标签

获取 tags$div 对象(标题栏)以扩展到屏幕边缘(R Shiny 应用程序)