Shiny中如何读取多个动态文本输入并传入距离计算函数的via参数
Shiny航程距离计算工具修改方案
需要调整的核心点
- 动态生成的中转输入框ID为
textin+序号格式,需要批量读取所有输入框的非空值,作为via参数传入距离计算函数 - 可对距离计算函数的循环逻辑做优化,避免索引运算优先级问题导致的计算错误
完整修改后代码
library(shiny) library(airportr) airport_distance_1 <- function(departing_airport_code, arriving_airport_code, via = NULL){ airports <- c(departing_airport_code, via, arriving_airport_code) # 过滤空的机场编码 airports <- airports[airports != ""] if (length(airports) < 2) { return(0) } if (length(airports) == 2) { distance <- airport_distance(airports[1], airports[2]) } else { distance1 <- numeric(length(airports)-1) # 优化循环索引写法,避免运算优先级问题 for (m in seq_len(length(airports)-1)){ distance1[m] <- airport_distance(airports[m], airports[m+1]) } distance <- sum(distance1) } return(distance) } ui <- fluidPage( sidebarPanel( textInput(inputId = "from_airport", label = "出发机场:", value = "LAX", width = "41%"), textInput(inputId = "to_airport", label = "到达机场:", value = "LHR", width = "41%"), h4("中转机场:"), actionButton("add_btn", "+ 添加中转点"), actionButton("rm_btn", "- 减少中转点"), textOutput("counter") ), mainPanel( uiOutput("textbox_ui"), h3("总航程距离(公里):"), textOutput("calc") ) ) server <- function(input, output, session) { # 跟踪中转输入框数量 counter <- reactiveValues(n = 0) observeEvent(input$add_btn, {counter$n <- counter$n + 1}) observeEvent(input$rm_btn, { if (counter$n > 0) counter$n <- counter$n - 1 }) textboxes <- reactive({ n <- counter$n if (n > 0) { lapply(seq_len(n), function(i) { textInput(inputId = paste0("textin", i), label = paste0("中转机场", i), value = "") }) } }) output$textbox_ui <- renderUI({ textboxes() }) summary_calc <- reactive({ n <- counter$n # 批量读取所有中转输入框的值,过滤空值 via_vals <- if(n > 0){ vals <- sapply(seq_len(n), function(i){ input[[paste0("textin", i)]] }) vals[vals != ""] } else { NULL } airport_distance_1( departing_airport_code = input$from_airport, arriving_airport_code = input$to_airport, via = via_vals ) }) output$calc <- renderText({ round(summary_calc(), 2) }) } shinyApp(ui, server)
效果说明
添加中转点后输入机场三字码,工具会自动读取所有非空的中转机场编码,拼接为向量传入via参数,自动累加每一段航程的距离得到总航程。
内容的提问来源于stack exchange,提问作者Lily Clements
相关产品推荐
相关产品推荐

