【问题标题】:Store dynamic R shiny inputs in dataframe在数据框中存储动态 R 闪亮输入
【发布时间】:2021-10-31 19:07:08
【问题描述】:

我想要一个允许用户提供某些输入的 UI,如果他需要更多输入,他应该能够单击一个按钮,然后打开新的输入。感谢this entry,这一切都很好。

但是,现在我想从这些输入中创建一个数据框,我正在为此苦苦挣扎。这是我的代码:

library(shiny)

ui <- fluidPage(
 
  fluidRow(
    column(
      width = 6,
      uiOutput("selection_ui")
    ),
      
    column(
      width = 3,
      uiOutput("amount_ui")
    ),
    
    column(
      width = 3,
      uiOutput("year_ui")
    )
  ),
  
  fluidRow(
    column(
      width = 6,
      actionButton(inputId = "addEntry", 
                   label = "Add Entry")
    ),
    
    column(
      width = 6,
      actionButton(inputId = "deleteEntry",
                   label = "Delete Entry")
    )
  ),
  br(),
  
  fluidRow(
    column(
      width = 12,
      actionButton(inputId = "Go",
                   label = "Submit")
    )
  ),
  
  dataTableOutput("Dataframe")
)

server <- function(input, output){
  
  counter <- reactiveValues(value = 1)
  
  AllInputs <- reactive({
    x <- reactiveValuesToList(input)
  })
  
  observeEvent(input$addEntry, {
    counter$value <- counter$value + 1
  })
  
  observeEvent(input$deleteEntry, {
    req( counter$value >= 2 )
    counter$value <- counter$value - 1
  })
  
  selection <- reactive({
    n <- counter$value
    
    if(n > 0){
      isolate({
        lapply(seq_len(n), function(i){
          selectInput( inputId = paste0("select",i),
                       label = paste0(i, "-th selection:"),
                       choices = as.list(c("", "A", "B", "C")),
                       selected = AllInputs()[[paste0("select",i)]]
          )
        })
      })
    }
  })
  
  amount <- reactive({
    n <- counter$value
    
    if(n > 0){
      isolate({
        lapply(seq_len(n), function(i){
          numericInput(inputId = paste0("number",i),
                       label = paste0(i, "-th amount:"),
                       value = AllInputs()[[paste0("number",i)]])
        })
      })
    }
  })
  
  year <- reactive({
    n <- counter$value
    
    if(n > 0){
      isolate({
        lapply(seq_len(n), function(i){
          numericInput(inputId = paste0("year",i),
                       label = paste0(i, "-th year:"),
                       value = AllInputs()[[paste0("year",i)]])
        })
      })
    }
  })
  
  output$selection_ui <- renderUI({selection()})
  output$amount_ui <- renderUI({amount()})
  output$year_ui <- renderUI({year()})

  eventReactive(input$Go, {
    df <- data.frame(CREATE DATAFRAME HERE)
  })
  
  output$dataframe <- renderDataTable(df())
}

shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我想我用sapply()解决了这个问题:

      df <- eventReactive(input$Go, {
        n <- counter$value
    
        tmp1 <- sapply(seq_len(n), function(i){
          input[[paste0("select",i)]]
        })
        
        tmp2 <- sapply(seq_len(n), function(i){
          input[[paste0("number",i)]]
        })
        
        tmp3 <- sapply(seq_len(n), function(i){
          input[[paste0("year",i)]]
        })
        
        data.frame(col1 = tmp1, 
                   col2 = tmp2,
                   col3 = tmp3 
                  )
      })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 2020-03-20
      • 2018-08-14
      • 2021-06-21
      • 2019-06-14
      • 1970-01-01
      相关资源
      最近更新 更多