renderprint learn examples ejemplos r render shiny

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) }