learn - Usa expresiones reactivas en renderPlot y descarga el controlador cuando usas funciones propias
shiny examples (1)
Usa expresiones reactivas en renderPlot y descarga el controlador
He tenido problemas al usar expresiones reactivas en renderPlot()
y en downloadHandler()
en aplicaciones brillantes. Quiero hacer esto para reducir el mantenimiento y la redundancia en mi código.
El problema anterior funciona con funciones de trazado "normales" como plot, hist, etc. En mi aplicación estoy usando una función más compleja que crea un trazado. He creado una versión simplificada de ella
helpfunc <- function(mean, sd) {
hist(rnorm(1000, mean, sd))
lines(1:10)
}
Si usa esta función ahora en su shiny app
, no funciona cuando crea una expresión reactiva. Ni usando plot()
ni usando la expresión reactiva en sí misma.
mwe <- function() {
app = list(
ui = bootstrapPage(
fluidPage(
sidebarPanel(
sliderInput("mean", "choose mean", -10, 10, 1),
sliderInput("sd", "choose sd", 0, 5, 1)),
mainPanel(
plotOutput("hist"),
downloadButton("histDownload")
)
)
),
server = function(input, output) {
output$hist <- renderPlot(.hist())
.hist <- reactive(helpfunc(input$mean, input$sd))
output$histDownload <- downloadHandler(
filename = function() {
paste("hist.jpg")
},
content = function(file) {
jpeg(file, quality = 100, width = 800, height = 800)
.hist() ## works not for plot(.hist()) either
dev.off()
}
)
}
lines
es básicamente una llamada a plot.xy
Tiene el mismo problema que tenía antes, excepto que esta vez no puede asignar la salida de lines
. Como antes, puede asignar la salida de la función hist
.
helpfunc <- function(mean, sd) {
hist = hist(rnorm(1000, mean, sd))
myLines = function(){lines(1:10)}
myLines()
list(hist = hist, lines = myLines)
}
mwe2 <- function() {
app = list(
ui = bootstrapPage(
fluidPage(
sidebarPanel(
sliderInput("mean", "choose mean", -10, 10, 1),
sliderInput("sd", "choose sd", 0, 5, 1)),
mainPanel(
plotOutput("hist"),
downloadButton("histDownload")
)
)
),
server = function(input, output) {
output$hist <- renderPlot(.hist())
.hist <- reactive(helpfunc(input$mean, input$sd))
output$histDownload <- downloadHandler(
filename = function() {
paste("hist.jpg")
},
content = function(file) {
myHist <- .hist()
jpeg(file, quality = 100, width = 800, height = 800)
plot(myHist$hist)
myHist$lines()
dev.off()
}
)
}
)
runApp(app)
}