【问题标题】:Reading Multiple Text Inputs into a Function in Shiny将多个文本输入读入 Shiny 中的函数
【发布时间】:2021-11-24 14:55:25
【问题描述】:

我有一种情况,我想要一个按钮,例如“添加通过”,然后用户可以在距离计算中添加多个通过选项来查看两点之间的距离。 我在其他地方读过如何读取多个文本框以添加数据。但是,我不清楚如何将多个文本框的输出读取到函数中。

如何为多个文本框使用“通过”选项?

当前代码如下。

airport_distance_1 <- function(departing_airport_code, arriving_airport_code, via = NULL){
  
  airports <- c(departing_airport_code, via, arriving_airport_code)
  
  if (length(airports) == 2) {
    distance <- airportr::airport_distance(airports[1], airports[2])
  } else {
    distance1 <- NULL
    for (m in 2:length(airports)-1){
      distance1[m] <- airportr::airport_distance(airports[m], airports[m+1])
    }
    distance <- sum(distance1)
  }
  
  return(distance)
}


ui <- shinyUI(fluidPage(
  
  sidebarPanel(
    textInput(inputId = "from_airport", label = "From:", value = "LAX", width = "41%"),
    textInput(inputId = "to_airport", label = "To:", value = "LHR", width = "41%"),
    
    h4("Via:"),
    actionButton("add_btn", "+"),
    actionButton("rm_btn", "-"),
    textOutput("counter")
    
  ),
  
  mainPanel(uiOutput("textbox_ui"),
            splitLayout(textOutput("calc")))
  
))

server <- shinyServer(function(input, output, session) {
  
  # Track the number of input boxes to render
  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
  })
  
  #output$counter <- renderPrint(print(counter$n))
  
  textboxes <- reactive({
    
    n <- counter$n
    
    if (n > 0) {
      lapply(seq_len(n), function(i) {
        textInput(inputId = paste0("textin", i),
                  label = paste0("Variable", i), value = "")
      })
    }
    
  })
  
  output$textbox_ui <- renderUI({ textboxes() })
  
  summary_calc <- reactive(
    airport_distance_1(departing_airport_code = input$from_airport,
                       arriving_airport_code = input$to_airport,
                       via = input$Variable1)
  )
  
  output$calc <- renderText({
    summary_calc()
  })
  
  
})

shinyApp(ui, server)

理想情况下,我希望能够阅读,比如说,

airport_distance_1("LAX", "LHR", via = c("NBO", "DUB"))

非常感谢。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    查看并遇到this 帖子后,我已经能够修改代码以使其更新:

    library(shiny)
    
    ui <- shinyUI(fluidPage(
      
      sidebarPanel(
        textInput(inputId = "from_airport", label = "From:", value = "LAX", width = "41%"),
        textInput(inputId = "to_airport", label = "To:", value = "LHR", width = "41%"),
        
        numericInput("NoVars", "Via:", 
                     value = 0, min = 0),
        
        uiOutput("VarsInput")
    
      ),
      
      mainPanel(
        verbatimTextOutput("train_emissions")
      )
      
    ))
    
    # Define the server code
    server <- function(input, output){
      
      K <- reactive({
        input$NoVars
      })
      
      output$VarsInput <- renderUI({
        NoV = K()
        
        if (NoV == 0){
          L = 0
          output = NULL
        } else {
          L = sapply(1:NoV, function(i){paste0("via_",i)})
          output = tagList()
          
          for(i in seq_along(1:NoV)){
            output[[i]] = tagList()
            output[[i]][[1]] = textInput(L[i], label = "Label for via:", 
                                         value = "Label for via here")
          } ## for loop
        }
        output
      })
      
      output$train_emissions <- renderPrint({
        if (input$NoVars == 0){
          C <- NULL
        } else {
          C <- sapply(1:K(), function(i) {input[[paste0("via_",i)]]})
        }
    
        airport_distance_1(departing_airport_code = input$from_airport,
                           arriving_airport_code = input$to_airport,
                           via = C)
        
      })
      
    }
    
    # Return a Shiny app object
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2013-11-28
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2015-11-27
      • 2023-03-20
      相关资源
      最近更新 更多