我有一些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语句。你会怎么做?
答案 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)