我想设计一个带有两个按钮的Shiny应用程序。用户可以根据需要多次单击“添加UI”按钮,这将返回文本框。然后,用户可以在输入框中键入数字,单击“求和”按钮,然后计算总数。
下面是我的当前代码,是根据?insertUI
的示例代码修改的。我的问题是我不确定如何从更新的UI(在本例中为新文本框)引用输入ID。我当前的尝试无法计算总和。最终结果始终为0。
# Define UI
ui <- fluidPage(
actionButton("add", "Add UI"),
actionButton("sum", "Sum"),
# Report the output
h4("The total from input"),
textOutput("text")
)
# Server logic
server <- function(input, output, session) {
observeEvent(input$add, {
insertUI(
selector = "#add",
where = "afterEnd",
ui = textInput(paste0("txt", input$add),
"Insert some text")
)
})
# Calculate the total from the text inputs
output$text <- eventReactive(input$sum, {
as.character(sum(as.numeric(unlist(mget(ls(pattern = "^txt"))))))
})
}
# Complete app with UI and server components
shinyApp(ui, server)
答案 0 :(得分:1)
您可以使用特殊的Shiny变量input
来检查和访问应用程序中的当前输入(和值)。因此,您可以获取新插入的UI元素(假设它们都遵循一种模式)并针对它们进行计算。
output$text <- eventReactive(input$sum, {
txt_inpt_names <- names(input)[grepl("^txt", names(input))]
sum(sapply(txt_inpt_names, function(x) as.numeric(input[[x]])), na.rm = T)
})
值得一提的是,Shiny需要对input
值进行一次(一次)访问,因此这就是为什么需要sapply()
而不仅仅是input[[txt_inpt_names]]
的原因。