在Shiny中构建dplyr功能的交互式版本

时间:2016-09-05 20:51:34

标签: r dplyr shiny

我正在构建一个Shiny应用程序,用于处理用户选择的多个文本文件。 输出是一个包含数百万行和数十列的庞大数据帧。 我现在感兴趣的是允许用户以交互方式过滤行,选择列和汇总列(通过从函数列表中选择,例如mean,sd,max,min,sum等...)。结果将是一个较小的数据框,总结了每个用户选择的数据 - 基本上我需要创建一个实现dplyr库基本功能的GUI。

一般来说,我知道如何通过手动创建一堆GUI元素并将它们输入到具有许多dplyr命令的服务器函数中来实现。由于这似乎是一个非常标准的功能(GUI过滤和总结数据帧),在我从头开始构建它之前,我想知道是否有任何东西"现成的#34;我可以使用现状或作为我的起点。

1 个答案:

答案 0 :(得分:2)

我知道你说rpivotTable并不是你所追求的,但我认为它可以被配置为做一些繁重的工作,

这是一个示例(使用rpivotTable进行操作,DT显示data.frame,rvest来解析来自DOM的innerHTML,可能有更好的数据格式从客户端传递表对象,但这是概念证明):

ui.R

library(shiny)
library(DT)
library(rpivotTable)

FullPage <- fluidPage(
    DT::dataTableOutput('aSummaryTable'),
    rpivotTableOutput('RESULTS')
)

FullPage

server.R:

library(shiny)
library(rpivotTable)
library(DT)
library(rvest)

function(input, output, session) {

  # Make some sample data
  qbdata <- reactive({
    expand.grid(LETTERS,1:3)
  })

  # Clean the html and store as reactive
  summarydf <- eventReactive(input$myData,{
    input$myData %>% 
       read_html %>% 
       html_table(fill = TRUE) %>% 
       # Turns out there are two tables in an rpivotTable, we want the second
       .[[2]]

  })

  # show df as DT::datatable
  output$aSummaryTable <- DT::renderDataTable({
      datatable(summarydf(), rownames = FALSE)
  })

  # Whenever the config is refreshed, call back with the content of the table
  output$RESULTS <- renderRpivotTable({
    rpivotTable(
      qbdata(),
      onRefresh = 
        htmlwidgets::JS("function(config) { 
                           Shiny.onInputChange('myData', document.getElementById('RESULTS').innerHTML); 
                        }")
    )
  })

}