shinyServer(function(input, output, clientData) {
  # A plot of fixed size
  output$plot1 <- renderImage({
    # A temp file to save the output. It will be deleted after renderImage
    # sends it, because deleteFile=TRUE.
    outfile <- tempfile(fileext='.png')
    # Generate a png
    png(outfile, width=400, height=400)
    hist(rnorm(input$n))
    dev.off()
    # Return a list
    list(src = outfile,
         alt = "This is alternate text")
  }, deleteFile = TRUE)
  # A dynamically-sized plot
  output$plot2 <- renderImage({
    # Read plot2's width and height. These are reactive values, so this
    # expression will re-run whenever these values change.
    width  <- clientData$output_plot2_width
    height <- clientData$output_plot2_height
    # A temp file to save the output.
    outfile <- tempfile(fileext='.png')
    png(outfile, width=width, height=height)
    hist(rnorm(input$obs))
    dev.off()
    # Return a list containing the filename
    list(src = outfile,
         width = width,
         height = height,
         alt = "This is alternate text")
  }, deleteFile = TRUE)
  # Send a pre-rendered image, and don't delete the image after sending it
  output$plot3 <- renderImage({
    # When input$n is 1, filename is ./images/image1.jpeg
    filename <- normalizePath(file.path('./images',
                              paste('image', input$n, '.jpeg', sep='')))
    # Return a list containing the filename
    list(src = filename)
  }, deleteFile = FALSE)
})Run the code above in your browser using DataLab