es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

image_composite (Magick) devuelve un error en Shiny Flexdashboard.

Necesito construir una imagen compuesta en un Shiny Flexdashboard para colocar un gráfico Ggplot2 sobre una imagen de fondo.

Utilizo el siguiente código:

“`{r}

renderImage({

bkgDom <- image_read('background.png')
myChart <- ggplot(data=individualObs, aes(individualObs$SA)) + geom_histogram()
fig <- image_graph(width = 600, height = 550)
myChart
dev.off()
image_composite(bkgDom, fig, offset = "+1030+50", operator = "multiply") }, deleteFile = TRUE)
“`

El código dentro de renderImage() funciona bien en RStudio, pero devuelve el error “object of type ‘externalptr’ is not subsettable” cuando se utiliza en el código de Shiny Flexdashboard.

¿Alguna idea de cómo resolver este problema?

¡Gracias de antemano por su amable apoyo!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el error es causado por el uso del puntero externo fig en la función image_composite(). Este puntero es creado por la función image_graph(), que genera un nuevo dispositivo de imagen para el gráfico ggplot2. En Shiny, cada sesión se ejecuta en su propio entorno aislado, lo que puede causar problemas con los punteros externos.

    Una solución para este problema es utilizar la función ggplot2::ggplot_build() para extraer los datos del gráfico de ggplot2, y luego utilizar la función ggplot2::ggplot_gtable() para convertirlos en un objeto grob que se puede trazar sobre una imagen de fondo.

    Aquí tienes un ejemplo de código que muestra cómo hacer esto:

    “`{r}
    library(ggplot2)
    library(magick)

    Cargar imagen de fondo

    bkgDom <- image_read(‘background.png’)

    Crear gráfico ggplot2

    myChart <- ggplot(data=iris, aes(x=Sepal.Length, y=Sepal.Width)) +
    geom_point()

    Extraer datos del gráfico

    chartData <- ggplot_build(myChart)$data[[1]]

    Convertir gráfico a objeto grob

    chartGrob <- ggplot_gtable(chartData)

    Combinar imagen de fondo y gráfico ggplot2

    mergedImage <- image_composite(bkgDom, as.raster(chartGrob),
    offset=”+1030+50″, operator=”multiply”)

    Mostrar la imagen en un flexdashboard de Shiny

    shinyImage(mergedImage)
    “`

    Ten en cuenta que este código asume que la imagen de fondo y el gráfico ggplot2 tienen las mismas dimensiones y están alineados correctamente. Ajusta el parámetro offset de la función image_composite() según sea necesario para lograr la posición deseada.

Comments are closed.