0

rpivotTableリフレッシュ調整のパッケージを使用したピボットテーブルのpdfダウンロードについて質問したいです。

私は自分が望むものに非常に近づいていますが、最後のステップが必要です.

これが私のコードです:

光沢のあるアプリ: app.r:

library(rpivotTable)
library(shiny)
library(htmlwidgets)

list_to_string <- function(obj, listname) {
if (is.null(names(obj))) {
paste(listname, "=", list(obj) )
} else {
paste(listname, "=", list( obj ),
      sep = "", collapse = ",")
}
}

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,"'")
  }
 })
 paste(allvalues, collapse = ",")
 })



pivotRefresh2 <- reactive({
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,"'")
  }
 })
 paste(allvalues, collapse = ",")

 })


 PivotTable<-reactive({
 rpivotTable(data=cars, onRefresh=htmlwidgets::JS("function(config) {  Shiny.onInputChange('myPivotData', config); }"))
 })

 PivotTable2<-reactive({

rpivotTable(data=cars, 
##### Replace "pivotRefresh2()" Here
writeLines(pivotRefresh2()  )
)

})

output$mypivot = renderRpivotTable({
PivotTable()
})

output$report = downloadHandler(
filename<- function(){
  paste("Demo_Data_Analysis",Sys.Date(),".pdf",sep = "")
},
content = function(file) {
  src <- normalizePath('Apply.Rmd')

  # temporarily switch to the temp dir, in case you do not have write
  # permission to the current working directory
  owd <- setwd(tempdir())
  on.exit(setwd(owd))
  file.copy(src, 'Apply.Rmd', overwrite = TRUE)

  library(rmarkdown)
  out <- render('Apply.Rmd', pdf_document())
  file.rename(out, file)
 },
 contentType = 'application/pdf'
 )

 }

 ui <- shinyUI(fluidPage(
 fluidRow(column(6,verbatimTextOutput("pivotRefresh")),
       column(6, rpivotTableOutput("mypivot") )),
 downloadButton('report',"Download this plot")
 )
 )

 shinyApp(ui = ui, server = server) 

私のpdfのマークダウン:Rmd:

---
title: "Untitled"
author: "Statistician"
date: "December 3, 2016"
output: pdf_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
```


```{r Time_Single, out.width = "500px"}

saveWidget( PivotTable2(), file= 'temp_Time_single123.html')
respivot123 =  webshot::webshot('temp_Time_single123.html','my-  screenshotime_single123.png')
knitr::include_graphics(respivot123)

```

ピボット テーブルの上部にあるテキスト出力は、rPivotTableパッケージの正しいパラメーター入力なので、パラメーター入力領域に入力するだけで済みます。試してみましたが、うまくいきwriteLines()ません。

他のすべてはすでに適切に設定されており、唯一の問題はパラメーターの配置方法##### Replace "pivotRefresh2()" Hereです!

どうもありがとう!

よろしくお願いします!

4

1 に答える 1

2

私たちの友人

do.call私が正しく理解すれば解決策になります。文字列化されたリストとして引数を渡そうとする代わりに、リストを使用する必要があります。以下は、目的を達成すると思われる変更を加えたコードです。これを例全体に組み込むための変更を含むコメントが表示されます。rpすべてが正しく機能していることを確認できるように、グローバルとして割り当てました。その割り当てを削除し、囲みをobserveに戻しreactiveます。

library(rpivotTable)
library(shiny)
library(htmlwidgets)

list_to_string <- function(obj, listname) {
  if (is.null(names(obj))) {
    paste(listname, "=", list(obj) )
  } else {
    paste(listname, "=", list( obj ),
          sep = "", collapse = ",")
  }
}

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,"'")
      }
    })
    paste(allvalues, collapse = ",")
  })



  pivotRefresh2 <- reactive({
    items <- input$myPivotData[c("cols","rows","vals", "exclusions","aggregatorName", "rendererName")]

    # need to remove the outside list container
    #  for rows and cols
    #  did not test thoroughly but these seemed to be
    #  the only two that require this
    items$cols <- unlist(items$cols,recursive=FALSE)
    items$rows <- unlist(items$rows,recursive=FALSE)

    items
  })

  PivotTable<-reactive({
    rpivotTable(data=cars, onRefresh=htmlwidgets::JS("function(config) {  Shiny.onInputChange('myPivotData', config); }"))
  })


  ########## add this to demo ###############
  ### what we are getting ###################
  observe({str(pivotRefresh2())})

  ########## change this back to reactive ##
  PivotTable2<-observe({
    ### do ugly global assign ################
    ### after done with Shiny ################
    ### rp available to inspect ##############
    rp <<- do.call(rpivotTable,c(list(data=cars),pivotRefresh2()))
  })

  output$mypivot = renderRpivotTable({
    PivotTable()
  })

  output$report = downloadHandler(
    filename<- function(){
      paste("Demo_Data_Analysis",Sys.Date(),".pdf",sep = "")
    },
    content = function(file) {
      src <- normalizePath('Apply.Rmd')

      # temporarily switch to the temp dir, in case you do not have write
      # permission to the current working directory
      owd <- setwd(tempdir())
      on.exit(setwd(owd))
      file.copy(src, 'Apply.Rmd', overwrite = TRUE)

      library(rmarkdown)
      out <- render('Apply.Rmd', pdf_document())
      file.rename(out, file)
    },
    contentType = 'application/pdf'
  )

}

ui <- shinyUI(fluidPage(
  fluidRow(column(6,verbatimTextOutput("pivotRefresh")),
           column(6, rpivotTableOutput("mypivot") )),
  downloadButton('report',"Download this plot")
)
)

shinyApp(ui = ui, server = server) 

ファローアップ

他にご不明な点がございましたら、お気軽にお問い合わせください。

于 2016-12-07T14:49:18.117 に答える