0

I have seen in several examples that the input for .Rmd files are coming from input objects. I have checked the similar questions (also this one)

I have the following problem:

  ui <- fluidPage(
      fileInput(inputId =  "File",label =  "Upload file...",accept=c("zip","text")),
      radioButtons('format', 'Document format', c('PDF', 'HTML', 'Word'),
                   inline = TRUE),
      downloadButton('downloadReport'),
      tableOutput("AEP")
    )
)

The input object is a zip file. contains different folders. I extract the suitable folders and picking up my files in server function.

    server <- function(input, output){
      options(shiny.maxRequestSize=50*1024^2) 
      output$AEP <- renderTable({
      infile=input$File

      if (is.null(infile))
        return(NULL)

      report_list <- c("Park result.txt",
                       "Park result minus",
                       "Park result plus")
      temp_files <- unzip(infile$datapath)
      temp_files <- temp_files[grepl(paste(report_list, collapse = "|"), temp_files)]
T=length(temp_files)
  t1=3*c(1:(T/3))

  t2=c(1:T)
  t2=t2[-t1]
  p=c();for(i in 1:T){p[[i]]=c()}
  for(i in 1:(length(t1))){p[[t1[i]]]=read.table(temp_files[t1[i]],skip=1,sep=";")}
  for(i in 1:(length(t2))){p[[t2[i]]]=read.table(temp_files[t2[i]],skip=2,sep=";")}
...

And finally I have my files as p[[i]]. I do calculations on those p[[i]], at the end my output called AEP (which is a table). I wanna use that table in markdown report. now for having proper input for my Rmd file I need to add this function to server :

output$downloadReport <- downloadHandler(
    filename = function() {
      paste('my-report', sep = '.', switch(
        input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
      ))
    },

    content = function(file) {
      # Copy the report file to a temporary directory before processing it, in
      # case we don't have write permissions to the current working dir (which
      # can happen when deployed).
      tempReport <- file.path(tempdir(), "report.Rmd")
      file.copy("report.Rmd", tempReport, overwrite = TRUE)

      # Set up parameters to pass to Rmd document
      params <- list(n = output$AEP)

      # Knit the document, passing in the `params` list, and eval it in a
      # child of the global environment (this isolates the code in the document
      # from the code in this app).
      rmarkdown::render(tempReport, output_file = file,
                        params = params,
                        envir = new.env(parent = globalenv())
      )
    }
  )

Which I could not compile it because :

params <- list(n = output$AEP)  

and Error : Reading objects from shinyoutput object not allowed. Any Idea of how I should define params would be very much appreciated. (I have tried n=input$File and it did not worked)

I do not know also how should I proceed with reactive() function in this case.

Ali Hadjihoseini
  • 941
  • 1
  • 11
  • 31
  • What happens if you try `params <- list( n = AEP() )`? – Ryan Morton Jul 27 '17 at 15:08
  • @RyanMorton Since AEP is not a function Just a data frame, it returns error : Error : could not find function "AEP" – Ali Hadjihoseini Jul 27 '17 at 16:32
  • Ok, output$AEP is NOT a dataframe, it is a rendered (in HTML) table. I'd suggest you create the dataframe as a reactive object and render the table separately. `AEP <- reactive({ ...all your data work...}); output$AEP <- renderTable({ AEP() })`. My suggestion should work better then. – Ryan Morton Jul 27 '17 at 17:00

0 Answers0