2012-01-07 9 views
14

Estoy implementando una solución para el problema del vendedor itinerante (TSP) en R (recocido simulado) y deseo generar la mejor ruta actual de forma periódica. He buscado bastante para generar gráficos durante un ciclo for y hasta ahora he fallado.Trazado durante un ciclo en RStudio

Uso RStudio, y quiero ver los gráficos a medida que se generan. Si alguna vez has visto a los solucionadores de TSP hacer lo suyo, entenderás lo genial que es mirar. Aquí hay una muestra de la salida de gráficos que quiero ver http://www.staff.science.uu.nl/~beuke106/anneal/anneal.html

No creo que el uso de memoria sea un problema (durante aproximadamente 500,000 iteraciones, solo estoy esperando 50-100 parcelas). Aquí es una función de ejemplo, donde esperaríamos ver 10 parcelas diferentes durante el tiempo que se ejecuta la función:

Plotz <- function(iter = 1000000, interval = 100000) { 
    x <- 1:10 
    for(i in 1:iter){ 
    y <- runif(10) 
    if(i %% interval == 0) { 
     plot(x, y) 
    } 
    } 
    return(c(x, y)) 
} 
Plotz() 

Cuando ejecuto esto, todo lo que veo es la trama final producido (en rstudio). ¿Cómo puedo ver las tramas a medida que se generan?

También: Estoy en Ubuntu (cualquiera que sea la última versión estable). No sé si eso es relevante.

Gracias a todos de antemano.

EDITAR: Por sugerencia del Capitán Murphy, traté de ejecutar esto en la terminal de Linux, y aparecieron los gráficos. Sigo pensando en la pregunta "¿Cómo hacer esto en RStudio?" Sin embargo, sigue siendo relevante. Es un programa tan bueno, entonces ¿alguien tiene una idea de qué se puede hacer para que esto funcione?

EDIT2: Como dijo Thilo, este es un error conocido en Rstudio. Si alguien tiene alguna otra idea para resolver esto sin que el software en sí sea reparado, todavía hay algo por discutir. De lo contrario, considera esta pregunta resuelta.

+1

Pruebe su código en la consola estándar R (no en R studio). Las tramas iterativas parecen aparecer para mí, no solo una al final. –

+1

No sé si ya lo ha visto, pero hay flechas de ida y vuelta en el panel de trazado de RStudio, que en realidad son una gran manera de recorrer las tramas generadas (no las noté por un tiempo) . Por supuesto, no ve las tramas a medida que se generan, pero después puede recorrer esas tramas con la frecuencia que desee. –

+4

No tengo una respuesta completa para usted, pero tal vez alguna información: Parece que esto (¿fue?) Un error en RStudio en 2011. Consulte http://support.rstudio.org/help/discussions/suggestions/214- plots-should-update-in-real-time-osx – Thilo

Respuesta

8

Una cosa que puede hacer es abrir una ventana x11 y la trama de allí:

x11() 
Plotz() 

Eso debería funcionar de la misma como ejecutarlo en el terminal.

1
Plotz <- function(iter = 1000, interval = 100) { 
    x <- 1:10 
    p <- 0 #plot number 
    for(i in 1:iter){ 
    y <- runif(10) 
    if(i %% interval == 0) { 
     p <- p + 1; plot(x, y) 
     readline("Please press the Enter key to see the next plot if there is one.") 
    } 
    } 
    return(c(x, y)) 
} 
Plotz() 
1

También puede utilizar las flechas de vuelta en la pestaña Gráficos del panel inferior izquierda de la interfaz rstudio con el fin de ver las parcelas.

16

Llamar a Sys.sleep (0) debe hacer que dibuje la trama. A diferencia de la solución X11, esto funcionará en las versiones de servidor de RStudio también.

(Me sorprendió que dev.flush() no dieron el resultado que usted esperaba, que podría ser un error.)

+1

Esta es una buena solución también. La diferencia entre este y @Sacha es que si generamos muchos gráficos en un período corto, este (al menos en mi sistema) no siempre mostrará todos los gráficos si se generan demasiado rápido. Esto no es necesariamente algo malo, dependiendo de si quiere ver todas las parcelas o si su objetivo es solo tener una idea general de cuál es el estado actual del sistema TSP. Para mis propósitos, la solución x11() funciona mejor, pero esta también es excelente. – Rguy

2

Si desea guardar las parcelas, así que sólo podría abrir una nueva dispositivo en el bucle y ciérrelo después.

Plotz <- function(iter = 1000, interval = 100) { 
    x <- 1:10 

    p <- 0 #plot number 

    for(i in 1:iter){ 

    y <- runif(10) 
    if(i %% interval == 0) { 
     png(file=paste(i,"png",sep=".")) 
     p <- p + 1; plot(x, y) 
     dev.off() 
    } 
    } 
return(c(x, y)) 
} 
7

El seguimiento de la respuesta de @ @ JoeCheng y comentario de RGuy en esa respuesta: mientras worked out with the RStudio folks, el problema parece surgir principalmente cuando hay demasiado trazado pasando en un lapso de tiempo demasiado corto. La solución es doble:

  • Sys.sleep(0) ayuda a forzar una actualización de la ventana de trazado.
  • Trazando las actualizaciones cada W th loop en lugar de cada ciclo.

Por ejemplo, en mi equipo (i7, rstudio Server), el siguiente código no se actualiza hasta que el bucle se completa:

N <- 1000 
x <- rep(NA,N) 
plot(c(0,1)~c(0,N), col=NA) 
for(i in seq(N)) { 
    Sys.sleep(.01) 
    x[i] <- runif(1) 
    iseq <- seq(i-99,i) 
    points(x[i]~i) 
    Sys.sleep(0) 
} 

Las siguientes actualizaciones de código, en tiempo real, a pesar de tener el mismo número de puntos a ser trazado:

N <- 1000 
x <- rep(NA,N) 
plot(c(0,1)~c(0,N), col=NA) 
for(i in seq(N)) { 
    Sys.sleep(.01) 
    x[i] <- runif(1) 
    iseq <- seq(i-99,i) 
    if(i%%100==0) { 
    points(x[iseq]~iseq) 
    Sys.sleep(0) 
    } 
} 

En otras palabras, es el número de llamadas que el plot que parece importar, no la cantidad de datos que se van a representar.

+1

Mi problema es ¿qué ocurre cuando quiero trazar en una ventana de TCL TK? No puedo encontrar la manera de actualizar mi ventana. Cuando hago 'Sys.sleep (0)', se está actualizando, pero no puedo ver los cambios hasta que muevo (literalmente) la ventana manteniendo presionada y moviendo la barra de título. – David

0

Puede usar el paquete animado para aplicar capas a sus gráficos en un GIF.

Cuestiones relacionadas