请参考更新的UI输入ID并计算闪亮的总和

时间:2019-02-04 18:35:12

标签: r shiny

我想设计一个带有两个按钮的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)

1 个答案:

答案 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)
  })

optional callback parameter

值得一提的是,Shiny需要对input值进行一次(一次)访问,因此这就是为什么需要sapply()而不仅仅是input[[txt_inpt_names]]的原因。