使用DT :: renderDataTable时,如何在server = TRUE时访问哪些行被过滤

时间:2015-10-23 23:55:27

标签: r shiny dt

我正在使用Shiny应用程序让用户选择列,过滤行并下载结果。我正在使用数据表来执行此操作。数据文件适度大,使用客户端处理导致相当显着的减速;但是,使用服务器端处理我无法访问过滤的数据集。

换句话说,当renderDataTable()中的server = FALSE时,输入$ foo_rows_all将返回所有已过滤的行,但是当server = TRUE时,输入$ 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)

1 个答案:

答案 0 :(得分:1)

您可以使用input$data_true_search_columnsinput$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)