如果没有 UI 个可用输入,则阻止在 Shiny 中发生事件

Prevent an event happened in Shiny if no UI inputs are available

我想知道在没有 UI 输入可用的情况下如何防止事件发生。在下面的示例中,有一个名为 Add UI 的操作按钮。这个想法是用户可以单击该按钮并根据需要多次添加数字输入。然后他们可以输入数值。准备就绪后,他们可以单击 Sum 按钮。这些数字的总和将是 "Total" 数字输入的输入值。

但是,如果用户在添加任何 UI 之前单击 Sum 按钮,应用程序将停止。我想让 Sum 按钮即使没有添加 UI 也可以点击,保持 "Total" 数字输入的输入值为 0.

关于如何计算添加的 UI 输入总和的相关问题来自此处:

library(shiny)

# Define UI
ui <- fluidPage(
  actionButton("add", "Add UI"),
  actionButton("sum", "Sum"),

  # Input as the sum
  numericInput(inputId = "Total", label = "Total", value = 0)

)

# Server logic
server <- function(input, output, session) {
  observeEvent(input$add, {
    insertUI(
      selector = "#add",
      where = "afterEnd",
      ui = numericInput(paste0("txt", input$add), label = "Number", value = 0)
    )
  })

  Num_In <- reactiveValues(
    Total_In = 0
  )

  total_input <- reactive({Num_In$Total_In})

  observeEvent(input$sum, {
    num_names <- names(input)[grepl("^txt", names(input))]

    Num_In$Total_In <- sum(sapply(num_names, function(x) input[[x]]), na.rm = TRUE)

    updateNumericInput(session = session,
                       inputId = "Total", 
                       value = total_input())
  })
}

# Complete app with UI and server components
shinyApp(ui, server)

一个简单的 if 条件行得通吗?您可以检查对象 num_names 长度是否等于 0:

if (length(num_names) == 0) {
  foo <- 0
} else {
  foo <- sum(sapply(num_names, function(x) input[[x]]), na.rm = TRUE)
}

此代码段检查长度是否为 0 并分配 0 或使用 sum 而不是 num_names

完整 observeEvent 代码:

observeEvent(input$sum, {
  num_names <- names(input)[grepl("^txt", names(input))]

  if (length(num_names) == 0) {
    foo <- 0
  } else {
    foo <- sum(sapply(num_names, function(x) input[[x]]), na.rm = TRUE)
  } 
  Num_In$Total_In <- foo

  updateNumericInput(session = session,
                     inputId = "Total", 
                     value = total_input())
})