首页 > 解决方案 > Rhsiny:根据更新的 rhandsontable 对象自动更新输出对象

问题描述

我有一个带有两张桌子的应用程序。一个表是一个可渲染的对象,另一个只是一个可渲染的对象。我希望当我更新我的 renderhandsontable 对象时,它会自动更新我的 rendertable 对象。我的 renderhandontable 对象是由应用程序中其他地方的数据使用多个过滤器创建的。

我在这里引用了几个非常有用的帖子,以帮助我在创建可用于多个输出对象的反应表方面取得进展,例如

如何在不多次执行的情况下从同一个分析中渲染多个输出?(闪亮的)

获取 Rhandsontable 的选定行

Handsontable:如何在渲染函数中更改单元格值

但我似乎无法越过这最后一道障碍。我还尝试添加一个按钮(使用eventReactive),所以当我按下它而不是自动更新表格时,表格会更新,但那里没有运气(并且自动肯定是首选)。

我在下面创建了一个过于简化的服务器代码版本。

#dummy data
x = c('A','A','A', 'B','B', 'c')
y = c('G1', 'G1', 'G1', 'G2', 'G2','G3')
z = c('100', '200', '300', '400','500','600')

b=data.frame('Category' = x,
             'Group' = y,
             'Total' = z)

#create reactive object to be used in multiple places
test <- reactive({

  t <-filter(b, b$Category %in% input$cat & b$Group %in% input$group)

  return(t)

})

output$test_table <- renderTable({

  tbl = data.frame(matrix(0, ncol = 4, nrow = 4))

#I know something needs to be done prior to this step to get updated values #of test()

  tbl[1,1] <- test()[1,3]

  return(tbl)
})


output$contents <- renderRHandsontable({

  rhandsontable(test())

})

我可以让我的表格正确显示并且最初更新数据,但是一旦我对我的表格进行了更新,它就不会反映在我的第二个表格中。

我已经为此苦苦挣扎了很长一段时间,所以任何帮助或提示将不胜感激!

标签: shinyshiny-servershiny-reactivityrhandsontableshinyapps

解决方案


请阅读。您可以通过访问 rhandsontable参数input$my_id。要获取当前数据,请使用 input$my_id$params$data。

这就是我认为你所追求的:

library(shiny)
library(rhandsontable)

ui <- fluidPage(rHandsontableOutput("contents"),
                tableOutput("test_table"),
                tableOutput("test_table_subset"))

server <- function(input, output) {

  # dummy data
  x = c('A', 'A', 'A', 'B', 'B', 'C')
  y = c('G1', 'G1', 'G1', 'G2', 'G2', 'G3')
  z = c('100', '200', '300', '400', '500', '600')

  b = data.frame('Category' = x,
                 'Group' = y,
                 'Total' = z)

  # create reactive object to be used in multiple places
  test <- reactive({
    t <- b # dplyr::filter(b, b$Category %in% input$cat & b$Group %in% input$group)
    return(t)
  })

  output$contents <- renderRHandsontable({
    rhandsontable(test())
  })

  contentsTableDat <- reactive({
    req(input$contents)
    hot_to_r(input$contents)
  })

  output$test_table <- renderTable({
    contentsTableDat()
  })

  output$test_table_subset <- renderTable({
    contentsTableDat()[1, 3]
  })
}

shinyApp(ui = ui, server = server)

推荐阅读