从R ShinyTable获取已编辑的单元格以更新dataFrame

时间:2016-03-07 07:55:30

标签: r shiny reactive-programming handsontable

我有一个R数据帧,我在R ShinyTable中渲染。 ShinyTable中的编辑效果很好。

我的问题是:如何进行用户所做的编辑并更新我的数据框。

以下代码取自ShinyTable的教程网站。它有一个错误:"尝试访问已弃用的shinysession $ session对象。请直接访问shinysession对象。"但代码中没有任何内容涉及shinySession。

如果我可以获得帮助来回答我的主要问题(如何进行用户所做的编辑),我可以解决此错误。

 library(shiny)
 library(shinyTable)
server <- function(input, output, session) {
  rv <- reactiveValues(cachedTbl = NULL)
  output$tbl <- renderHtable({
    if (is.null(input$tbl)){
      tbl <- matrix(0, nrow=3, ncol=3)
      rv$cachedTbl <<- tbl
      return(tbl)
    } else{
      rv$cachedTbl <<- input$tbl
      return(input$tbl)
    }
  })  

  output$tblNonEdit <- renderTable({
    input$actionButtonID
    isolate({
      rv$cachedTbl
    })
  })    
}
ui <- shinyUI(pageWithSidebar(
  headerPanel("shinyTable with actionButton to apply changes"),
  sidebarPanel(
    helpText(HTML("
                  Make changes to the upper table, press the button to activate. 
                  <p>Created using <a href = \"http://github.com/trestletech/shinyTable\">shinyTable</a>."))),
  mainPanel(
    htable("tbl"),
    actionButton("actionButtonID","apply edits"),
    tableOutput("tblNonEdit")
  )
))

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

看起来像shineTable已经更新了几年。会话错误发生在包代码中,而不是代码中。

请尝试使用rhandsontable。

我发现这个问题/答案的一些示例代码有效: Update handsontable by editing table and/or eventReactive

library(shiny)
library(rhandsontable)

did_recalc <- FALSE

ui <- fluidPage(
  rHandsontableOutput('table'),
  textOutput('result'),
  actionButton("recalc", "generate new random vals and calculate")
)

server <- function(input,output,session)({
  values <- reactiveValues(data=as.data.frame(runif(2)))

  observe({
    input$recalc
    values$data <- as.data.frame(runif(2))
  })

  observe({
    if(!is.null(input$table))
      values$data <- hot_to_r(input$table)
  })


  output$table <- renderRHandsontable({
    rhandsontable(values$data)
  })


  output$result <- renderText({ 
    sum(values$data)
  })
})  

shinyApp(ui = ui, server = server)