在R shiny中结合DT :: datatable,proxy和selectizeInput字段

时间:2016-06-28 13:27:42

标签: r shiny dt

我正在编写一个闪亮的应用程序,该应用程序应提供DT datatable中所有选定条目的列表。我希望能够取消选择 datatable中的单个条目,而无需浏览整个表格并取消选中所有条目。

我所做的是使用DT的开发版本和代理连接。有了这个,我可以在文本字段中选择行,自动选择datatable中的行,反之亦然。

如果我选择"快速"则会出现问题。因此,如果我很快删除文本字段中的10个条目,那么整个事情会再次更新它,并且似乎会在无限循环中自行更新。

有没有办法使用信号量或类似的东西来防止这种行为?由于我在原始应用中使用ggplot2创建数字会花费一秒或更长时间,这取决于您在datatable中选择的行数,因此它变得更加极端。

我还提供了一个取消选中所有行的按钮,但我希​​望能够取消选择特定的行。

希望有人有一个聪明的主意。这是一个可重复的示例,其中包含一些示例数据。它没有做任何事情......所以只需选择几行并从文本字段中快速删除它们,看看我在说什么。

library(shiny)
# devtools::install_github('rstudio/DT') # Needs developmentversion for proxy
library(DT)

annotation <- data.frame(
  names=sapply(seq(1000), function(x) paste0(sample(letters,5, replace=FALSE), collapse='')),
  values=runif(1000)
)

# Define UI for application that draws a histogram
ui <- shinyUI(fluidPage(
   # Sidebar with a slider input for number of bins
   sidebarLayout(
      sidebarPanel(
         selectizeInput('selected_names', 'selected name',
                        width='100%',
                        unique(annotation$names),
                        multiple=TRUE)
      ),

      mainPanel(
         plotOutput("distPlot")
      )
   ),
   DT::dataTableOutput("my_table")
))

server <- shinyServer(function(input, output, session) {
  output$my_table <- DT::renderDataTable({
    DT::datatable(annotation)
  })
  proxy = DT::dataTableProxy('my_table')

  shiny::observe(
    {
      rows <- match(input$selected_names, annotation$names)
      print(rows)
      selectRows(proxy, as.numeric(rows))
    })

  output$distPlot <- renderPlot({
    selected_rows <- input$my_table_rows_selected
    updateSelectizeInput(session, 'selected_names',
                         selected=annotation[as.numeric(selected_rows),]$names)
  })
})

shinyApp(ui = ui, server = server)

0 个答案:

没有答案