我有一个带有两个表的应用程序。一个表是一个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())
})
我可以使我的表正常显示,并且可以首先更新数据,但是一旦我对表进行了更新,它就不会反映在第二张表中。
我已经为此苦苦挣扎了很长时间了,因此,任何帮助或提示将不胜感激!
答案 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)