2014-11-05 16 views
8

Jestem całkiem nowy dla Shiny (i R) i walczę z eksportowaniem fabuły, którą wykonuję w Shiny do pliku png.Pobieranie png z Shiny (R)

Patrzyłem na tych dwóch wątków, ale nie mógł zrozumieć to:

Save plots made in a shiny app Shiny downloadHandler doesn't save PNG files

udaje mi się stworzyć przycisk pobierania w interfejsie użytkownika, a serwer wydaje się robić wszystko, co chcę go do też. Kiedy kliknę przycisk pobierania w oknie podglądu, wyskakujące okno prosi mnie o określenie lokalizacji pliku i nazwy, ale nie zapisano pliku. Kiedy robię to samo w oknie przeglądarki, plik PNG jest tworzony, ale jest pusty.

Każdy wgląd jest bardzo cenny!

ui.R

library(shiny) 

shinyUI(fluidPage(
    titlePanel("This is a scatterplot"), 

    sidebarLayout(
    sidebarPanel(

     fileInput('datafile', 'Choose CSV file', 
       accept=c('text/csv', 'text/comma-separated-values,text/plain')), 

     uiOutput("varselect1"), 

     uiOutput("varselect2"), 

     downloadButton('downloadPlot', 'Download Plot') 

    ), 

    mainPanel(   
      h4("Here is your scatterplot"), 
      plotOutput("plot1") 
       ) 
    )) 
) 

server.R

library(foreign) 

shinyServer(function(session,input, output) { 

    DataInput <- reactive({ 
     infile <- input$datafile 
     if (is.null(infile)) { 

     return(NULL) 
     } 
     read.csv(infile$datapath) 
    }) 


    output$varselect1 <- renderUI({ 

     if (identical(DataInput(), '') || identical(DataInput(),data.frame())) return(NULL) 

     cols <- names(DataInput()) 
     selectInput("var1", "Select a variable:",choices=c("---",cols[3:length(cols)]), selected=("---")) 

    }) 

    output$varselect2 <- renderUI({ 

     if (identical(DataInput(), '') || identical(DataInput(),data.frame())) return(NULL) 

     cols <- names(DataInput()) 
     selectInput("var2", "Select a variable:",choices=c("---",cols[3:length(cols)]), selected=("---")) 

    }) 



    plotInput <- reactive({ 

     a <- which(names(DataInput())==input$var1) 
     x_lab <- as.numeric(DataInput()[,a]) 


     b <- which(names(DataInput())==input$var2) 
     y_lab <- as.numeric(DataInput()[,b])  

     main.text <- paste("Scatterplot of the variables",colnames(DataInput())[a],"and", colnames(DataInput())[b],sep = " ", collapse = NULL) 

     plot(x_lab, y_lab, main=main.text, xlab=colnames(DataInput())[a], ylab=colnames(DataInput())[b], xlim=c(min(x_lab),max(x_lab)*1.05), ylim=c(min(y_lab), max(y_lab)*1.05)) 

     observations <- DataInput()[,1] 

     text(x_lab, y_lab, labels=observations, pos=3) 


    }) 

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


    output$downloadPlot <- downloadHandler(
     filename = "Shinyplot.png", 
     content = function(file) { 
     png(file) 
     print(plotInput()) 
     dev.off() 
     })  

    }) 

Odpowiedz

12

Rozwiązaniem tego dziwnego scenariusza była omawiana na shiny-discuss google group. Możesz jedynie zmienić swoją reaktywną instrukcję plotInput w normalną funkcję. Nie wiem, dlaczego downloadHandler nie gra przyjemnie z obiektami reaktywnymi.

# change 
plotInput <- reactive({...}) 

# into this 
plotInput <- function(){...} 

Można również usunąć instrukcji print w zaproszeniu downloadHandler:

output$downloadPlot <- downloadHandler(
     filename = "Shinyplot.png", 
     content = function(file) { 
     png(file) 
     plotInput() 
     dev.off() 
     })  
+0

To jest fantastyczne. Spędziłem ostatnie kilka godzin próbując pobrać kolekcję reaktywnych wątków i nie mogłem wyłapać, co było nie tak. Mój mózg jest zbyt smażony, by zrozumieć, czy jest jakikolwiek negatyw, który zmienia się z "reaktywny" na "funkcjonalny", ale wygląda na to, że działa dobrze – Adrian

Powiązane problemy