【问题标题】:Optimization of conditionalPanel() in R Shiny appR Shiny app中conditionalPanel()的优化
【发布时间】:2021-06-17 11:26:27
【问题描述】:

我正在开发一个闪亮的网络应用程序,但我遇到了 conditionalPanel() 的问题。好吧,这不是问题,因为该应用程序运行良好。但是,我对代码本身并不满意,因为它非常重复。我已经在这里阅读了很多内容,但找不到解决我正在寻找的问题的答案(如果我错过了一个适用于此的入口,请注意我),所以就这样吧。

我有一个条件面板,它根据下一个代码所示的条件显示一到四个数字输入。

library(shiny)
library(shinythemes)

ui <- fluidPage(

    theme = shinytheme('darkly'),
    
    titlePanel("Some nice title"),

    sidebarPanel(
        
        selectInput("BaseType", "Number of values:", c(seq(1,4))),

        conditionalPanel(
            condition = "input.BaseType == 1",
            numericInput("value1", "First value:", value = 0, step = 0.01)),

        conditionalPanel(
            condition = "input.BaseType == 2",
            numericInput("value1", "First value:", value = 0, step = 0.01),
            numericInput("value2", "Second value:", value = 0, step = 0.01)),
        
        conditionalPanel(
            condition = "input.BaseType == 3",
            numericInput("value1", "First value:", value = 0, step = 0.01),
            numericInput("value2", "Second value:", value = 0, step = 0.01),
            numericInput("value3", "Third value:", value = 0, step = 0.01)),
        
        conditionalPanel(
            condition = "input.BaseType == 4",
            numericInput("value1", "First value:", value = 0, step = 0.01),
            numericInput("value2", "Second value:", value = 0, step = 0.01),
            numericInput("value3", "Third value:", value = 0, step = 0.01),
            numericInput("value4", "Fourth value:", value = 0, step = 0.01))
    )
)

server <- function(input, output) {
}

shinyApp(ui = ui, server = server)

这不是整个应用程序,它只是我的应用程序的一个总结示例。确切地说,我在问是否有办法不在每个conditionalPanel() 中重复相同的行(我在 R 方面很新,特别是在闪亮方面)。如果有人需要一些上下文,该应用程序是关于滴定曲线生成器的,这部分是针对弱酸和碱的,根据它有多少 pKa 或 pKb,我想要的输入量。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    您可以在server 中使用lapply 动态生成numericInput,这将避免重复代码以获得可能的输入。

    library(shiny)
    library(shinythemes)
    
    ui <- fluidPage(
      theme = shinytheme('darkly'),
      titlePanel("Some nice title"),
      sidebarPanel(
        selectInput("BaseType", "Number of values:", c(seq(1,4))),
        uiOutput('value')
    ))
    
    server <- function(input, output) {
      output$value <- renderUI({
        lapply(seq_len(input$BaseType), function(x) {
          numericInput(paste0('value', x), sprintf("value %d :", x), 
                       value = 0, step = 0.01)
        })
      })
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 我一直在寻找这样的东西,但不知道该怎么做。这是一个非常简单的解决方案,我喜欢它。我必须做一个简单的修改,因为我的真实应用程序不是从 1 到 4,而是从“mono”到“tetra”,但这是相同的想法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-09-20
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2020-03-20
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多