在阅读excel文件后使用闪亮的应用程序下载pdf图

时间:2016-08-20 19:13:32

标签: r shiny shiny-server

因为,我是新手,闪亮的应用程序需要一些帮助,上传excel文件和生成表格输出闪亮的应用程序工作正常,但无法下载绘图为pdf格式 这是我的代码

library(shiny)
library(openxlsx)
library(lattice)

runApp(
  list(
    ui = fluidPage(
      titlePanel("plots"),
      sidebarLayout(
        sidebarPanel(
          fileInput('file1', 'Choose xlsx file',
                    accept = c(".xlsx")),
          tags$hr(),
          downloadButton('down',"download plot")
        ),
        mainPanel(
          tableOutput('contents'),
        plotOutput('plot'))
      )
    ),
    server = function(input, output){
      output$contents <- renderTable({
        inFile <- input$file1

        if(is.null(inFile))
          return(NULL)
        else
        read.xlsx(inFile$datapath)
      })

      plotInput <- reactive({
        df <- input$file1
        xyplot(df[,2]~df[,1],df(),xlim=c(0,10),ylim=c(0,100),type = "b")
      })

      output$plot <- renderPlot({
        print(plotInput())
      })

      output$down <- downloadHandler(
        filename = function(){paste("plot",".pdf",sep=".") },
        content = function(file) {
          pdf(file)
         xyplot(df[,2]~df[,1],df(),xlim=c(0,10),ylim=c(0,100),type = "b")
          dev.off()
        }
      )
    }
  )
)

1 个答案:

答案 0 :(得分:1)

问题在于,在代码的某些部分,您通过df()访问了动态数据框,但您从未定义过它。

在这类问题中,最好创建一个反应数据框,比如df,其中包含上传的数据,并通过df()传递给代码的其他反应部分。

完整示例:

library(shiny)
library(openxlsx)
library(lattice)

runApp(
  list(
    ui = fluidPage(
      titlePanel("plots"),
      sidebarLayout(
        sidebarPanel(
          fileInput('file1', 'Choose xlsx file',
                    accept = c(".xlsx")),
          tags$hr(),
          downloadButton('down',"download plot")
        ),
        mainPanel(
          tableOutput('contents'),
          plotOutput('plot'))
      )
    ),
    server = function(input, output){


      df <- reactive({
        inFile <- input$file1
        req(inFile) # require that inFile is available (is not NULL) 
                    # (a user has uploaded data)

        # read.xlsx(inFile$datapath)
        head(iris, 10)
      })

      output$contents <- renderTable({
        # access uploaded data via df()
        df()
      })

      plotInput <- reactive({
        df <- df()
        xyplot(df[,2]~df[,1], df ,xlim=c(0,10),ylim=c(0,100),type = "b")
      })

      output$plot <- renderPlot({
        plotInput()
      })

      output$down <- downloadHandler(
        filename = function(){paste("plot",".pdf",sep=".") },
        content = function(file) {
          pdf(file)
          #xyplot(df[,2]~df[,1],df(),xlim=c(0,10),ylim=c(0,100),type = "b")

          # you have to print the plot so that you can open pdf file
          print(plotInput())
          dev.off()
        }
      )
    }
  )
)