我正在编写一个闪亮的应用程序,该应用程序应提供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)