如果没有 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())
})
我想知道在没有 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())
})