Download png aus Glänzend (R)
Ich bin ziemlich neu in Glänzende (und R) und kämpft mit den ausführenden der Handlung, die ich machen in Shiny zu einer png-Datei.
Sah ich diese beiden threads, aber konnte es nicht herausfinden:
Speichern Grundstücke in glänzender app
Glänzende downloadHandler nicht speichern PNG-Dateien
Schaffe ich es schaffen den download-button in der Benutzeroberfläche und der server scheint, zu tun, was ich will, es zu tun, auch. Wenn ich auf den download-button in der Vorschau-Fenster, ein pop-up-Fenster die mich auffordert, geben Sie den Speicherort der Datei und den Namen, aber keine Datei gespeichert ist. Wenn ich das gleiche tun in einem browser-Fenster, eine png-Datei ist erstellt, aber es ist leer.
Jede Einsicht wird sehr geschätzt!
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()
})
})
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen workaround für dieses seltsame Szenario diskutiert wurde auf der glänzend-besprechen Sie die google-Gruppe. Was Sie tun können, ändern Sie einfach Ihre reaktive
plotInput
- Anweisung in eine normale Funktion. Nicht sicher, warumdownloadHandler
spielt nicht schön mit reaktiver Objekte.Können Sie auch entfernen Sie die print-Anweisung in der
downloadHandler
nennen:reactive
zufunction
ist, aber es scheint gut zu funktionieren