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.

ggsave en el portapapeles en Windows

Me gustaría guardar un gráfico en mi portapapeles sin salir de RStudio en Windows. Algo similar se ha preguntado para gráficos base de R, pero me gustaría usar ggplot+ggsave.

Operación de ejemplo del gráfico:

“`{r}
library(tidyverse)
{
ggplot(data = mtcars, aes(y = mpg, x = wt)) + geom_point()
} %>%
ggsave("plot.png", .)

<pre><code><br />No es difícil, por supuesto, navegar hasta el directorio de trabajo/plot.png en el explorador de archivos, hacer clic derecho en el archivo y copiarlo, pero eso requiere clics adicionales y tiempo.

Una posible estrategia podría ser intentar copiarlo al portapapeles mediante una llamada al sistema(), por ejemplo:

“`{r}
library(tidyverse)
{
ggplot(data = mtcars, aes(y = mpg, x = wt)) + geom_point()
} %>%
ggsave(“plot.png”, .) %>%
{system( # comando de Windows aquí)}

pero estoy teniendo problemas para encontrar el comando correcto de Windows, al menos sin descargar utilidades adicionales. Dado que savePlot() de R base puede guardar en el portapapeles, debería haber alguna forma de hacerlo, ¿verdad?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, parece que actualmente no hay una manera sencilla de guardar directamente un ggplot en el portapapeles en Windows sin salir de RStudio o descargar utilidades adicionales. Como mencionaste, un enfoque posible sería utilizar ggsave() para guardar el gráfico en un archivo y luego usar una llamada a system() para copiar ese archivo en el portapapeles utilizando un comando de Windows. Sin embargo, encontrar el comando de Windows adecuado para lograr esto puede ser desafiante, especialmente si deseas evitar descargar utilidades adicionales.

    Una alternativa podría ser utilizar paquetes de R que proporcionan funciones para copiar datos en el portapapeles, como clipr o clipboard. Por ejemplo, podrías guardar el gráfico como un archivo PNG usando ggsave(), y luego usar clipr::write_clip() o clipboard::write_clipboard() para copiar el contenido binario del archivo en el portapapeles.

    Aquí hay un ejemplo:

    “`{r}
    library(tidyverse)
    library(ggplot2)
    library(clipr)

    Generar un ggplot

    mi_grafico <- ggplot(data = mtcars, aes(y = mpg, x = wt)) + geom_point()

    Guardar el gráfico como un archivo PNG

    ggsave(“grafico.png”, mi_grafico)

    Leer el contenido binario del archivo en una variable

    contenido_grafico <- readBin(“grafico.png”, what = “raw”, n = file.info(“grafico.png”)$size)

    Copiar el contenido binario en el portapapeles

    clipr::write_clip(contenido_grafico, format = “png”)


    Este código guardará el gráfico como un archivo PNG llamado "grafico.png" en el directorio de trabajo, leerá el contenido binario del archivo en una variable llamada `contenido_grafico` y luego copiará ese contenido en el portapapeles utilizando `clipr::write_clip()`. Ten en cuenta que necesitarás tener el paquete `clipr` instalado para utilizar este enfoque. Alternativamente, podrías intentar utilizar el paquete `rsvg` para guardar el gráfico como un archivo SVG y copiar directamente el código SVG en el portapapeles. Este es un ejemplo: ```{r} library(tidyverse) library(ggplot2) library(rsvg) # Generar un ggplot mi_grafico <- ggplot(data = mtcars, aes(y = mpg, x = wt)) + geom_point() # Convertir el gráfico a código SVG codigo_svg <- rsvg_grob(mi_grafico, format = "svg") # Copiar el código SVG en el portapapeles writeLines(codigo_svg, "grafo-portapapeles.svg") clipboard::write_clipboard(readLines("grafo-portapapeles.svg", n = -1))

    Este código utilizará rsvg_grob() del paquete rsvg para convertir el ggplot en código SVG, escribirá ese código en un archivo SVG temporal llamado “grafo-portapapeles.svg” y luego copiará el contenido de ese archivo en el portapapeles utilizando clipboard::write_clipboard(). Nuevamente, ten en cuenta que necesitarás tener los paquetes rsvg y clipboard instalados para utilizar este enfoque.

Comments are closed.