【问题标题】:Rhsiny: Automatically update an output object based on updated rhandsontable objectRhsiny:根据更新的 rhandsontable 对象自动更新输出对象
【发布时间】:2019-09-30 22:24:07
【问题描述】:

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

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

How to render multiple output from the same analysis without executing it multiple time? (Shiny)

Get selected rows of Rhandsontable

Handsontable : how to change cell value in render function

但我似乎无法克服这最后一道障碍。我还尝试添加一个按钮(使用 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())

})

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

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

【问题讨论】:

    标签: shiny shiny-server shiny-reactivity rhandsontable shinyapps


    【解决方案1】:

    请阅读this。您可以通过input$my_id 访问rhandsontable params。要获取当前数据,请使用 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)
    

    【讨论】:

    • 谢谢@ismirsehregal!我知道我必须使用“$”,但我无法完全遵循所有示例,也无法在某处找到可靠的文档。我目前收到一个错误:“警告:
    • @CjV 那是因为您没有为您的filter 电话提供input$catinput$group。请查看我的编辑。
    • 这是有道理的,谢谢@ismirsehregal!还有一个问题,我如何只访问反应表的一个元素?例如,如果我只想使用第 1 行第 3 列中的值来更新表(我的数据将从这种简化格式发生变化——它可能最终会使用一整列并将另一个表中的数据乘以该值列),看来我不能做 input$contents$params$data[1,3] 吗?我的问题有意义吗?有没有办法把它当作一个数据框来对待?
    • 您正在收到list(),您可以像这样访问它:input$contents$params$data[[1]][3] 或获取我准备的 data.frame:contentsTableDat[1, 3]
    • 这真的很有帮助!非常感谢您的解释!
    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多