2015-10-19 186 views
4

我找到了一個有趣的包rpivotTable。 我想創建shiny app,其中包括rpivotTable,可以使用downloadHandler下載生成的數據。下載rpivotTable輸出閃亮

但是,我無法找到解決方案,如何創建data.frame或其他我可以傳遞給downloadHandler函數的其他東西。

rpivotTable創建類的一個對象:

class(pivot) 
[1] "rpivotTable" "htmlwidget" 

是士林任何的可能性來下載這個函數的輸出?

此外,我附上了示例,如何創建閃亮的示例以及我想要使用的下載函數示例。

也許是其他想法或建議?

set.seed(1992) 
n=99 
Year <- sample(2013:2015, n, replace = TRUE, prob = NULL) 
Month <- sample(1:12, n, replace = TRUE, prob = NULL) 
Category <- sample(c("Car", "Bus", "Bike"), n, replace = TRUE, prob = NULL) 
Brand <- sample("Brand", n, replace = TRUE, prob = NULL) 
Brand <- paste0(Brand, sample(1:14, n, replace = TRUE, prob = NULL)) 
USD <- abs(rnorm(n))*100 

df <- data.frame(Year, Month, Category, Brand, USD) 



output$Pivot <- rpivotTable::renderRpivotTable({ 
rpivotTable(data = df, rows = "Brand", col = "Category", vals = "USD", aggregatorName = "Sum", rendererName = "Table") 
}) 



    output$downloadData <- downloadHandler(
    filename = function() { paste(filename, '.csv', sep='') }, 
    content = function(file) { 
    write.csv(PivotOutput, file) 
}) 
+0

我包的作者。我對你想達到的目標感到困惑。 rpivotTable不會生成任何數據:它只是對所提供的數據進行切片和切塊。在你的例子中,要下載的數據將是'df'。或者我錯過了什麼? – Enzo

+0

嗨,謝謝你的迴應! – AK47

+0

嗨,謝謝你的迴應!我想要做的是將那些用rpivotTable製作的切片保存在數據框中。例如,我有一年的行,品牌列和美元作爲價值。有沒有辦法將這個切片存儲在數據框或類似的東西?我的目標是導出數據與數據的關鍵 – AK47

回答

3

我剛剛被推rpivotTable的主分支在github上,解決獲取參數的用戶是問題的改變/審視了在服務器端。

下載rpivotTable代碼devtools

devtools::install_github("smartinsightsfromdata/rpivotTable",ref="master") 

這是如何獲得在服務器端所選擇的數據爲例。這個例子並不完全滿足您的需求:您需要將原始數據框與您從rpivotTable中獲得的內容進行分組。但這應該足以讓你有一個良好的開端。

library(rpivotTable) 
library(shiny) 

list_to_string <- function(obj, listname) { 
    if (is.null(names(obj))) { 
    paste(listname, "[[", seq_along(obj), "]] = ", obj, 
      sep = "", collapse = "\n") 
    } else { 
    paste(listname, "$", names(obj), " = ", obj, 
      sep = "", collapse = "\n") 
    } 
} 

server <- function(input, output) { 

output$pivotRefresh <- renderText({ 

cnames <- list("cols","rows","vals", "exclusions","aggregatorName", "rendererName") 
# Apply a function to all keys, to get corresponding values 
allvalues <- lapply(cnames, function(name) { 
    item <- input$myPivotData[[name]] 
    if (is.list(item)) { 
    list_to_string(item, name) 
    } else { 
    paste(name, item, sep=" = ") 
    } 
}) 
paste(allvalues, collapse = "\n") 
}) 

output$mypivot = renderRpivotTable({ 
    rpivotTable(data=cars, onRefresh=htmlwidgets::JS("function(config) { Shiny.onInputChange('myPivotData', config); }")) 
    }) 
} 

ui <- shinyUI(fluidPage(
    fluidRow(column(6, verbatimTextOutput("pivotRefresh")), 
      column(6, rpivotTableOutput("mypivot"))) 
) 
) 

shinyApp(ui = ui, server = server) 
+0

我可能會在接下來的幾周內在可轉換的json導出中使用。會讓你知道。 – timelyportfolio

+0

@timelyportfolio來自onRefresh的實際輸出是帶有參數的列表(列表),所以json轉換不應該成爲問題。另一方面,我想知道OP的JSON導出會帶來什麼好處。將數據下載爲csv的缺失部分是一個函數,它具有以下入口點:數據幀,來自onRefresh的參數以及輸出要保存爲csv的子集數據幀。 – Enzo

+0

您是否找到下載rPivotTable的解決方案? – user3463225

2

爲了延長恩佐的出色答卷(謝謝你真棒包),我嘲笑了下面的方式來獲取彙總數據,並用它裏面有光澤。

這使用onRefresh來監視config中的更改,然後使用DOM獲取相關元素的innerHTML。在這種情況下,然後使用rvest來清理該HTML並提取表格,最後,爲了演示目的,將其顯示在DT::datatable內。

這可能太過分了,但可以直接下載爲CSV格式,或者傳遞給其他閃亮元素進行進一步處理。

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

} 
+0

偉大的方法@Shape。謝謝。 – Enzo