2016-09-05 36 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); 
         }") 
    ) 
    }) 

}