如何在Shiny中使用可编辑的DataTable作为另一个DataTable的输入

时间:2018-04-21 13:45:53

标签: r shiny dt

我希望用户能够编辑已经加载的DataTable,单击一个按钮,然后将编辑后的版本用作输入来完成工作。因此,在此示例中,如何在单击“更改数据帧”按钮时使新的用户编辑版本显示在“新建”选项卡中?

用户界面

shinyUI(fluidPage(

  titlePanel(),


  sidebarLayout(


    sidebarPanel(
      actionButton("runButton","Change Dataframes")
    ),

    mainPanel(
      tabsetPanel(
        tabPanel("OldIrisTab",
                 DT::dataTableOutput("OldIris")),
        tabPanel("OldPetrolTab",
                 DT::dataTableOutput("OldPetrol")),
        tabPanel("NewIrisTab",
                 DT::dataTableOutput("NewIris")),
        tabPanel("NewPetrolTab",
                 DT::dataTableOutput("NewPetrol"))
      )
    )
  )
))

服务器文件

shinyServer(function(input,output){


  output$OldIris <- DT::renderDataTable({
    datatable(iris,editable=T)
  })

  output$OldPetrol <- DT::renderDataTable({
    datatable(petrol,editable=T)

  })

  ######
  # HERES WHERE I'M NOT REALLY SURE WHAT TO DO 

  change_data1 <- eventReactive(input$runButton, {
    withProgress(message="Generating new dataframes",{

      newdf1 <- datatable(output$OldIris)
      newdf1

    })
  })

  change_data2 <- eventReactive(input$runButton, {
    withProgress(message="Generating new dataframes",{

      newdf2 <- datatable(output$OldPetrol)
      newdf1

    })
  })


  output$NewIris <- DT::renderDataTable({
    datatable(change_data1())
  })

  output$NewPetrol <- DT::renderDataTable({
    datatable(change_data2())
  })

  #######
  ######

})

1 个答案:

答案 0 :(得分:7)

使用rhandsontable包:

   library(shiny)
   library(rhandsontable)
   ui <- shinyUI(fluidPage(
               titlePanel("Ttile"),
                     sidebarLayout(
                     sidebarPanel(
                             actionButton("runButton","Change Dataframes")
                                  ),

  mainPanel(
     tabsetPanel(
          tabPanel("OldIrisTab",
             rHandsontableOutput('OldIris')),
          tabPanel("NewIrisTab",
             DT::dataTableOutput("NewIris"))
         )
       )
     )
   ))

server <- function(input,output,session)({
           values <- reactiveValues()

           output$OldIris <- renderRHandsontable({
           rhandsontable(as.data.frame(iris))
      })

   observeEvent(input$runButton, {

      values$data <-  hot_to_r(input$OldIris)

    })


      output$NewIris <- DT::renderDataTable({
                  datatable(values$data)
        })

    }) 

  shinyApp(ui, server)

我希望它有所帮助。您也可以查看此answer