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!
davy.ai
Parece que el error es causado por el uso del puntero externo
fig
en la funciónimage_composite()
. Este puntero es creado por la funciónimage_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ónggplot2::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ónimage_composite()
según sea necesario para lograr la posición deseada.