Rhsiny:基于更新的rhsonsontable对象

时间:2019-05-13 23:39:01

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

我有一个带有两个表的应用程序。一个表是一个renderhandsontable对象,另一个表只是一个rendertable对象。我想在更新我的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 ),以便在我按下该表时会更新该表,而不是自动更新,但在那里没有运气(并且绝对会首选自动)。

我在下面为我的 server 代码创建了一个过于简化的版本。

#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())

})

我可以使我的表正常显示,并且可以首先更新数据,但是一旦我对表进行了更新,它就不会反映在第二张表中。

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

1 个答案:

答案 0 :(得分:1)

请阅读this。您可以通过input$my_id访问rhansontable 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$params$data)
        # print(input$contents$params) # see available params
        if(length(input$contents$params$data) > 0){
            contentsTableDat <- do.call(rbind, lapply(input$contents$params$data, rbind))
            contentsTableDat[sapply(contentsTableDat, is.null)] <- NA # replace NULLs with NA
            contentsTableDat
        } else {
            NULL
        }
    })

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

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

shinyApp(ui = ui, server = server)