You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:06:04