При использовании DT :: renderDataTable, как мне узнать, какие строки фильтруются, когда server = TRUE

Я работаю над приложением Shiny, чтобы пользователи могли выбирать столбцы, фильтровать строки и загружать результат. Для этого я использую таблицы данных. Файл данных умеренно большой, и использование обработки на стороне клиента приводит к довольно значительному замедлению; однако, используя обработку на стороне сервера, я не могу получить доступ к отфильтрованному набору данных.

Другими словами, когда server = FALSE в renderDataTable (), input $ foo_rows_all возвращает все отфильтрованные строки, но когда server = TRUE input $ foo_rows_all возвращает только строки на текущей отображаемой странице, а не все строки. Как я могу получить доступ ко всем отфильтрованным строкам, когда server = TRUE.

Пример, показывающий проблему:

library(shiny)
library(dplyr)
library(DT)

dat<-data.frame(letters=c(rep("A",15),rep("B",5),rep("C",5)))

server<-shinyServer(function(input, output) {
  #Returns filtered data
  output$dat_false <- renderDataTable(dat,filter = "top",server = FALSE)
  #Returns just the currently visible values 
  output$dat_true <- renderDataTable(dat,filter = "top",server = TRUE)

  #This code modified from: https://yihui.shinyapps.io/DT-info/
  output$x5 = renderPrint({
    cat('\n\nAll rows with server = TRUE:\n\n')
    cat(input$dat_true_rows_all, sep = ', ')
    cat('\n\nAll rows with server = FALSE:\n\n')
    cat(input$dat_false_rows_all, sep = ', ')
  })
})

ui<-shinyUI(
  fluidPage(
    sidebarLayout(
      sidebarPanel(verbatimTextOutput('x5')),
      mainPanel(dataTableOutput("dat_true"),
                dataTableOutput("dat_false"))
    )
  )
)

shinyApp(ui,server)

person jhollist    schedule 23.10.2015    source источник
comment
Может быть, эта проблема была решена в более поздних версиях DT? Просто протестируйте свой пример, и сервер = ИСТИНА и сервер = ЛОЖЬ работают так, как задумано, и таким же образом ...   -  person martin    schedule 01.07.2021


Ответы (1)


У вас есть переменные input$data_true_search_columns и input$data_true_search для работы. Так, например, вы можете написать такую ​​функцию для получения выбранных строк (обратите внимание, что я использую fromJSON для преобразования json, но вы можете использовать chartr("[]", "()", ...) или что-то подобное, чтобы сделать это вручную. Я не знаю, правильный ли это способ , и чтобы иметь дело с выбором числового диапазона, вам нужно будет изменить функцию для работы с ними.

library(shiny)
library(dplyr)
library(DT)
library(jsonlite)

dat<-data.frame(letters=c(rep("A",15),rep("B",5),rep("C",5)))

activeRows <- function(cols) {
    active <- which(cols!='')
    if (!length(active)) return( seq_len(nrow(dat)) )
    vals <- lapply(cols[active], fromJSON)
    which(
      Reduce("&", lapply(seq_along(vals), function(i) dat[,i] %in% vals[[i]])))
}

server<-shinyServer(function(input, output) {
  #Returns filtered data
  output$dat_false <- renderDataTable(dat,filter = "top",server = FALSE)
  #Returns just the currently visible values 
  output$dat_true <- renderDataTable(dat,filter = "top",server = TRUE)

  #This code modified from: https://yihui.shinyapps.io/DT-info/
  output$x5 = renderPrint({
    cat('\n\nAll rows with server = TRUE:\n\n')
    cat(activeRows(input$dat_true_search_columns), sep = ', ')
    cat('\n\nAll rows with server = FALSE:\n\n')
    cat(input$dat_false_rows_all, sep = ', ')
  })
})

ui<-shinyUI(
  fluidPage(
    sidebarLayout(
      sidebarPanel(verbatimTextOutput('x5')),
      mainPanel(dataTableOutput("dat_true"),
                dataTableOutput("dat_false"))
    )
  )
)
shinyApp(ui,server)
person Rorschach    schedule 24.10.2015