2011-05-04 35 views
11

Quiero recorrer una parcela y poner el resultado de la parcela en PDF.Imprimir en PDF en un bucle for

El siguiente código se utiliza para hacer esto:

Lo que esto hace es bucle 3 veces y la trama 3 parcelas diferentes del conjunto de datos del iris. Luego debe guardarlo en la unidad C:/. Los archivos PDF se crean, pero están dañados.

for(i in 1:3){ 
    pdf(paste("c:/", i, ".pdf", sep="")) 
    plot(cbind(iris[1], iris[i])) 
    dev.off() 
} 
+2

Esto funciona para mí en Linux. (Bueno, cuando se usa una ruta adecuada en ese sistema, de todos modos). ¿Es el ejemplo que le das realmente a lo que estás haciendo o estás usando un sistema de trazado diferente? ¿Enrejado o ggplot2 quizás? Si es así, debe envolver las llamadas de trazado en 'print()' ya que la autoimpresión está desactivada en bucles y necesita imprimir objetos celosía o ggplot para que dibujen algo. –

+0

sí, están en celosía, pero este tampoco funciona ... –

+0

¿Hay algún error? Quiero decir, como @Chase menciona en su respuesta, ¿la ruta es válida en su sistema? ¿Qué tal si solo guardas en el directorio de trabajo si tienes permisos de escritura allí, y luego solo dejas caer la ruta como se muestra en @Chase. –

Respuesta

36

Para parcelas de celosía dibujadas en el dispositivo, es necesario imprimir el objeto producido por una llamada a una de las funciones de gráficos de celosía. Normalmente, en uso interactivo, R auto imprime objetos si no están asignados. Sin embargo, en los bucles, la impresión automática no funciona, por lo que se debe organizar para que se imprima el objeto, generalmente envolviéndolo en print().

Aquí es un ejemplo (disculpen mi abuso de la fórmula notación ;-):

require(lattice) 
for(i in 1:3) { 
    pdf(paste("plot", i, ".pdf", sep = "")) 
    print(xyplot(iris[,1] ~ iris[,i], data = iris)) 
    dev.off() 
} 

Esto produce las tres parcelas en un dispositivo pdf.

+2

Este es un caso especial de http: // cran.r-project.org/doc/FAQ/R-FAQ.html#Why-do-lattice_002ftrellis-graphics-not-work_003f (es un poco más difícil de entender ya que el cartel original nos dio lo que probablemente no sea el código real que eran tratando de correr) –

2

¿Es un nombre de archivo que contiene "c: /" un nombre de archivo válido en su sistema operativo? Parece una parte del directorio de trabajo que desea configurar antes de llamar al pdf. Me sale un error que me dice que no puede abrir ese archivo:

Error in pdf(paste("c:/", i, ".pdf", sep = "")) : 
    cannot open file 'c:/1.pdf' 

Si me cae el "C: /" poco del nombre de archivo, tres archivos PDF se generan correctamente. Además, si mueve el dev.off() fuera del bucle for, obtendrá un único PDF con tres páginas en lugar de tres archivos PDF. Puede o no puede ser lo que quieres ...

for(i in 1:3){ 
    pdf(paste("plot", i,".pdf",sep="")) 
    plot(cbind(iris[1],iris[i])) 
    dev.off() 
} 
+0

¿cómo configuro el directorio de trabajo para mi r? –

+1

'setwd()', por ejemplo .: 'setwd (" d: /my.dir ")'. –

+1

@Sir Ksilem: para saber dónde está el directorio de trabajo actual, use 'getwd()'. Para navegar a un directorio diferente, use 'setwd ('c:/path/to/new/directory')'. Creo que 'setwd()' puede funcionar con directorios absolutos y relativos, pero probablemente sea dependiente del sistema operativo. Las páginas de ayuda deben tener más detalles. – Chase