【问题标题】:How can I improve this length conditional if-else statement in my Shiny app?如何在我的 Shiny 应用程序中改进这个长度条件 if-else 语句?
【发布时间】:2019-06-05 19:28:23
【问题描述】:

我无法减少冗长的 if-else 语句。在我的 Shiny 应用程序中,用户输入“num_fact”(因子的数量)的值,该值通过代码多次使用以动态生成 UI 元素。

我已经尝试使用 lapply(),但我无法让它工作。

根据因素的数量,创建两个动态 UI 元素(级别和处理),每个元素的输入数量与因素的数量相同。我想从这些 UI 元素中提取值。

以下代码有效。

if (num_fact == 1) {
      levels <- c(input$n_F1)
      treatments <- c((input$t_F1)/100)
    } else if (num_fact == 2) {
      levels <- c(input$n_F1, input$n_F2)
      treatments <- c((input$t_F1)/100, (input$t_F2)/100)
    } else if (num_fact == 3) {
      levels <- c(input$n_F1, input$n_F2, input$n_F3)
      treatments <- c((input$t_F1)/100, (input$t_F2)/100, (input$t_F3)/100)
    } else if (num_fact == 4) {
      levels <- c(input$n_F1, input$n_F2, input$n_F3, input$n_F4)
      treatments <- c((input$t_F1)/100, (input$t_F2)/100, (input$t_F3)/100, (input$t_F4)/100)
    }

但它很长,我想改进它。我已经成功应用 lapply() 来根据因子的数量动态生成 UI 元素,如下:

  output$ui_factor_levels <- renderUI({
    req(input$num_fact)
    fluidRow(
      lapply(1:(as.numeric(input$num_fact)), function(i) {
        column(4, numericInput(paste0("n_F", i), h5(paste0("Factor ", i)), value = 2))
    })
    )
  })

我似乎无法将 if-else 语句用作 apply() 函数。我认为我的问题与水平和治疗的生成方式有关。

【问题讨论】:

    标签: r if-statement dynamic shiny apply


    【解决方案1】:

    您可以使用[[ ]] 运算符将输入名称作为字符串访问。例如

    library(shiny)
    ui <- fluidPage(
      mainPanel(
        numericInput("num_fact", "Num Fact", 3, min=1, max=4),
        numericInput("n_F1", "F1", 1),
        numericInput("n_F2", "F2", 1),
        numericInput("n_F3", "F3", 1),
        numericInput("n_F4", "F4", 1),
        textOutput("out")
      )
    )
    server <- function(input, output) {
      output$out <- renderText({
        num_fact <- input$num_fact
        levels <- sapply(paste0("n_F", 1:num_fact), function(x) input[[x]])
        print(levels)
        treatments  <- levels/100
        paste(treatments, collapse = ",")
      })
    }
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 2021-12-06
      • 2021-11-28
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      相关资源
      最近更新 更多