2016-09-05 35 views
0

我在构建一个处理用户选择的多个文本文件的Shiny应用程序。 输出是一个数百万行和数十列的巨大数据框。 我现在很感兴趣,允许用户交互式地过滤行,选择列并汇总列(通过从诸如平均值,sd,max,min,sum等的函数列表中选择)。结果将是一个较小的数据框架,总结每个用户选择的数据 - 基本上我需要创建一个实现dplyr库的基本功能的GUI。在Shiny中构建dplyr功能的交互式版本

一般来说,我知道如何通过手动创建一组GUI元素并将它们通过多个dplyr命令提供给服务器功能。因为这似乎是一个非常标准的功能(过滤和汇总数据框的GUI),在我开始从头构建它之前,我想知道是否有任何“现成的”,我可以使用AS IS或作为我的起点。

+0

rpivotTable非常接近你想要的。除出口外。如果他们想要导出,则可能需要深入回调以获取表格的当前状态。 – Shape

+0

我编辑了我的问题。我并不需要图形和导出功能才能成为解决方案的一部分。我可以根据自己的具体要求轻松实施它们。在这方面rpivotTable不是我所需要的,因为它试图做图形,但不是很优雅的方式,我没有看到任何自定义选项。此外,它不返回汇总数据帧,因此我无法对结果进行任何进一步处理(例如导出数据或创建自己的图形)。 – Sasha

+0

实际上有相当数量的自定义选项,尽管您需要检查文档的pivottable.js(与使用其他JS库端口到R一样,比如DT,文档主要留给JS库使用更新,html小部件只是一个包装)。我发现一种方法可以将你的输出作为闪亮的对象返回,你只需要在rpivotTable上使用onRefresh参数,然后通过DOM访问它。 – Shape

回答

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); 
         }") 
    ) 
    }) 

}