如何通过 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)
我尝试在 renderText
和 paste
调用之间添加 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 - 如何不让年份标签超出网格?