Скачать вывод rpivotTable в блестящем

Я нашел интересную посылку rpivotTable, Я хотел бы создать shiny app который включает в себя rpivotTable с возможностью загрузки сгенерированных данных с использованием downloadHandler,

Тем не менее, я не могу найти решение, как создать data.frame или что-то еще, что я мог бы передать downloadHandler функция.

rpivotTable создает объект класса:

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

Есть ли у trene какие-либо возможности для загрузки результатов этой функции?

Кроме того, я прилагаю пример того, как создается блестящий свод, и пример функции загрузки, которую я хотел бы использовать.

Может быть, есть какие-либо другие идеи или предложения?

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

2 ответа

Я только что добавил в основную ветку 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) 

Чтобы расширить превосходный ответ Энцо (спасибо за потрясающий пакет), я смоделировал следующее как способ получить обобщенные данные и использовать их внутри блестящей.

Это использует onRefresh чтобы наблюдать за изменениями в конфигурации, затем использует 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); 
                        }")
    )
  })

}

В репозитории github rpivotTabletocsv я пытаюсь осуществить экспорт rpivotTable в csv с помощью кнопки загрузки из приложения Rshiny.

Другие вопросы по тегам