将数据附加到 R 中的现有数据框

Append data to existing dataframe in R

嗨,有没有一种方法可以将数据附加到 R 中的现有数据。例如,下面的应用程序根据用户值填充了数据框,但现在,它只是创建新行而不是附加。

我们可以附加这个数据框吗?我也尝试使用反应值。但是没有用。 有办法实现吗?

library(shiny)
library(tidyr)
library(dplyr)
library(purrr)

ui <- basicPage(
  
  fluidRow(
    column(
      width = 6,
      textInput('a', 'Text A',"a1"),
      textInput('b', 'Text B',"b1"),
      textInput('c', 'Text A',"c1"),
      textInput('d', 'Text B',"d1"),
      textInput('e', 'Text A',"e1"),
      textInput('f', 'Text B',"f1"),
      uiOutput('f1')
    ),
    column(
      width = 6,
      tags$p(tags$span(id = "valueA", "")),
      tags$script(
        "$(document).on('shiny:inputchanged', function(event) {
          if (event.name === 'a') {
            $('#valueA').text(event.value);
          }
        });
        "
      )
      ,tableOutput('show_inputs')
    )
  )
)

server <- shinyServer(function(input, output, session){
  
  output$f1 <- renderUI({
    if(input$a == "a2"){
      textInput('z', 'Text B',"z1")
    } else {
      NULL
    }
  })
  
  AllInputs <- reactive({
    x <- reactiveValuesToList(input)
    # print(x)
    # data.frame(
    #   names = names(x),
    #   values = paste0(unlist(x, use.names = FALSE), Sys.time())
    # )
    
    tibble(
      key = names(x),
      data = x
    ) %>% 
      mutate(data = map(data, as.character)) %>% 
      unnest(data)
  })
  
  # observe({
  #   if(file.exists("file.csv")){
  #     write.table(AllInputs(), "file.csv", sep = ",", col.names = F, append = T, row.names = F)
  #   } else {
  #     write.csv(AllInputs(), "file.csv", sep = ",", row.names = F)
  #   }
  #   
  # })
  
  output$show_inputs <- renderTable({
    
    t(AllInputs())
  })
})
shinyApp(ui = ui, server = server)

您需要维护一个 reactiveVal 来保存您的行并在更改时附加到它:

library(shiny)
library(tidyr)
library(dplyr)
library(purrr)

ui <- basicPage(
   
   fluidRow(
      column(
         width = 6,
         textInput("a", "Text A","a1"),
         textInput("b", "Text B","b1"),
         textInput("c", "Text A","c1"),
         textInput("d", "Text B","d1"),
         textInput("e", "Text A","e1"),
         textInput("f", "Text B","f1"),
         uiOutput("f1")
      ),
      column(
         width = 6,
         tags$p(tags$span(id = "valueA", "")),
         tags$script(
            "$(document).on('shiny:inputchanged', function(event) {
                if (event.name === 'a') {
                   $('#valueA').text(event.value);
                }
             });"
      ), 
      tableOutput("show_inputs")
    )
  )
)

server <- shinyServer(function(input, output, session){
  
  my_data <- reactiveVal(list(character(0)) %>% 
                            rep(7) %>% 
                            set_names(letters[c(1:6, 26)]) %>% 
                            as_tibble())

  output$f1 <- renderUI({
    if(input$a == "a2"){
      textInput("z", "Text B", "z1")
    } else {
      NULL
    }
  })

  observe({
    new_row <- reactiveValuesToList(input)
    dat <- isolate(my_data())
    my_data(bind_rows(dat, new_row))
   })
  
  output$show_inputs <- renderTable({
    req(my_data())
  })
  
})

shinyApp(ui = ui, server = server)

请注意,如果您更改 input$a1 中的值,您将需要一些额外的逻辑来避免动态 input$f1 仍然保留文本。