我要创建140个renderUI元素。有没有更有效的方法?

时间:2019-12-20 15:35:19

标签: r shiny

我有一些renderUI代码,用于创建数字输入框并从列表中填充它们。 看起来像这样:

  output$Small1A <- renderUI({
    numericInput("Small1A","",min = 0, max = 100, value = Reduction()$Reduction[Reduction()$Category == "Small1A"])
    })

Reduction()是一个预加载了一些默认值或可以从文件加载的列表。 看起来像这样

Category Reduction
Small1A  0.5
Small2A  0.5
...
Medium3D 0.5
...
Huge7E  7.4

有140个元素(小,中,大,巨大)1-7和A-E

这些在用户界面上分为5个可折叠框,每个框内有4x7网格。

 column(1, offset = 1, uiOutput("Small1A")),
 column(1, offset = 0, uiOutput("Small2A")),
(and so)

考虑到源代码的规律性,看来我应该能够用更整洁的东西替换140个renderUI语句。你会怎么做?

1 个答案:

答案 0 :(得分:1)

以下是在评论中使用lapply作为建议的方法。我正在使用一些虚拟数据来说明如何将lapply与自定义numericInput函数结合在一起。

library(shiny)

some_values <- data.frame(Names = LETTERS[1:10], Values = seq(1, 100, 10))

make_num_in <- function(val) {
  numericInput(
    paste("in", val, sep = "_"),
    paste("in", val, sep = "_"),
    min = 0,
    max = 100,
    value = some_values[some_values$Names == val, "Values"]
  )
}

ui <- basicPage(
  column(5,
  actionButton("show1", "show 1"),
  uiOutput("box1"),
  actionButton("show2", "show 2"),
  uiOutput("box2")
  ),
  column(5,
        textOutput("input_A"),
        textOutput("input_F")
         )
)

server <- function(input, output, session) {
  observeEvent(input$show1, {
    output$box1 <-
      renderUI({
        tagList(lapply(LETTERS[1:5], make_num_in))
      })
  })

  observeEvent(input$show2, {
    output$box2 <-
      renderUI({
        tagList(lapply(LETTERS[6:10], make_num_in))
      })
  })

  output$input_A <- renderText(paste("input A is: ", input[["in_A"]]))
  output$input_F <- renderText(paste("input F is: ", input[["in_F"]]))

}

shinyApp(ui, server)