我有一个Shiny应用程序,可以添加和删除某些事件的很多标签。大多数选项卡包含彼此依赖的数据表。每个数据表都创建了一个代理。问题是,如果我使用tableProxy %>% selectRows(NULL)
重置表选择,然后使用removeTab()
删除包含该表的选项卡,则不会重置表示所选行的值。
这是一个最小的例子。要重现,请选择表格中的任何行并转到下一个选项卡。现在一切都很好。将打印所选行的索引。但是,如果单击该按钮,即使重置了选择并且包含该表的选项卡不再存在,您也会注意到打印值仍然相同。任何想法如何解决?
套餐版本:shiny_1.0.5
,DT_0.2
library(shiny)
library(DT)
ui <- fluidPage(
tabsetPanel(
id = "tabs",
tabPanel("Table",
dataTableOutput("table")
),
tabPanel("Button & text",
actionButton("button", "Reset selection & remove the tab"),
textOutput("text")
)
)
)
server <- function(input, output, session) {
output$table <- DT::renderDataTable({
head(mtcars)
})
tableProxy <- dataTableProxy('table')
observeEvent(input$button, {
tableProxy %>% selectRows(NULL)
removeTab("tabs", "Table")
})
observe({
print(paste("Observer", input$table_rows_selected))
})
data <- reactive({
print(paste("Reactive", input$table_rows_selected))
input$table_rows_selected
})
output$text <- renderText({
data()
})
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:0)
不确定是否有干净的解决方案。一种选择是添加中间reactiveVal
对象,并在删除表时将其设置为NULL
。或者在您的情况下,您可能需要考虑reactiveValues
,并使用表的名称作为其元素的名称来存储您选择的行,因为它听起来像是在动态生成大量表(?)。
library(shiny)
library(DT)
ui <- fluidPage(
tabsetPanel(
id = "tabs",
tabPanel("Table",
dataTableOutput("table")
),
tabPanel("Button & text",
actionButton("button", "Reset selection & remove the tab"),
textOutput("text")
)
)
)
server <- function(input, output, session) {
output$table <- DT::renderDataTable({
head(mtcars)
})
selected_rows <- reactiveVal()
tableProxy <- dataTableProxy('table')
observeEvent(input$button, {
tableProxy %>% selectRows(NULL)
selected_rows(NULL)
removeTab("tabs", "Table")
})
observe({
print(paste("Observer", input$table_rows_selected))
isolate(selected_rows(input$table_rows_selected))
})
data <- reactive({
print(paste("Reactive", selected_rows()))
selected_rows()
})
output$text <- renderText({
data()
})
}
shinyApp(ui = ui, server = server)
希望这有帮助!