重置数据表中的行选择,并在Shiny

时间:2018-01-12 15:55:01

标签: r shiny dt

我有一个Shiny应用程序,可以添加和删除某些事件的很多标签。大多数选项卡包含彼此依赖的数据表。每个数据表都创建了一个代理。问题是,如果我使用tableProxy %>% selectRows(NULL)重置表选择,然后使用removeTab()删除包含该表的选项卡,则不会重置表示所选行的值。

这是一个最小的例子。要重现,请选择表格中的任何行并转到下一个选项卡。现在一切都很好。将打印所选行的索引。但是,如果单击该按钮,即使重置了选择并且包含该表的选项卡不再存在,您也会注意到打印值仍然相同。任何想法如何解决?

套餐版本:shiny_1.0.5DT_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)

1 个答案:

答案 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)

希望这有帮助!