下载数据透视表输出



我发现了一个有趣的包rpivotTable。我想创建shiny app,其中包括rpivotTable,并可以使用downloadHandler下载生成的数据。

然而,我无法找到解决方案,如何创建data.frame或其他我能够传递给downloadHandler函数的东西。

rpivotTable创建一个类的对象:

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

有没有可能下载这个函数的输出?

另外,我附上了示例,如何在shiny中创建pivot和我想使用的下载函数的示例。

也许还有其他的想法或建议吗?
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)
})

我刚刚在github上的rpivotTable主分支上推送了一个更改,该更改解决了获取用户在服务器端正在/已经查看的参数的问题。

使用devtools:

下载rpivotTable代码
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) 

为了扩展Enzo的出色回答(感谢您提供的出色软件包),我模拟了以下方法来获取汇总数据并在shiny中使用它。

它使用onRefresh来监视配置中的更改,然后使用DOM来获取相关元素的innerHTML。在本例中,然后使用rvest清理html并提取表,最后,出于演示目的,将其显示在DT::datatable中。

这可能太粗糙了,但它可以直接作为CSV下载,或者传递给其他闪亮的元素进行进一步处理。

ui。R

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

服务器。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); 
                        }")
    )
  })
}

A github repository rpivotTabletocsv我尝试实现从Rshiny App下载按钮导出rpivotTable到csv。

相关内容

  • 没有找到相关文章

最新更新