Печать в PDF в цикле for

#r #pdf #loops #for-loop #pdf-generation

#r #PDF #циклы #for-цикл #pdf-генерация

Вопрос:

Я хочу выполнить цикл по графику и поместить результат графика в PDF .

Для этого используется следующий код:

Что это делает, так это выполняет цикл 3 раза и выводит 3 разных графика из набора данных iris. Затем он должен сохранить его на C:/ диск. PDF Файлы созданы, но повреждены.

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

Комментарии:

1. У меня это работает в Linux. (Во всяком случае, при использовании правильного пути в этой системе). Приведенный вами пример действительно то, что вы делаете, или вы используете другую систему построения графиков? Возможно, решетка или ggplot2? Если да, то вам нужно включить вызовы построения графиков print() , поскольку в циклах автоматическая печать отключена, и вам нужно распечатать объекты lattice или ggplot, чтобы заставить их что-то рисовать.

2. да, они находятся в lattice, но этот тоже не работает…

3. Есть ошибки? Я имею в виду, как упоминает @Chase в своем ответе, действителен ли путь в вашей системе? Как насчет простого сохранения в рабочий каталог, если у вас есть права на запись там, тогда просто укажите путь, как показано @Chase.

4. это работало раньше, когда я не использовал цикл, я мог создавать PDF-файлы на моем C: / path

5. Перед чем? Вы показали нам фрагмент кода, который, как вы утверждаете, не работает, но не сказали, в чем заключалась ошибка, во всяком случае, код на самом деле не соответствует реальной проблеме (построение решетчатой графики в цикле). Разбейте это на простые шаги. Можете ли вы создать один график в "C:/plot_1.pdf" ( C обязательно ли он должен быть прописным в Windows?)? Если вы можете, попробуйте цикл, но без битов pdf() и dev.off() и посмотрите, сможете ли вы создать три графика решетки. Наконец, если оба варианта работают, соедините их вместе. Смотрите мой ответ для кода, который вы должны иметь возможность просто запустить для Lattice.

Ответ №1:

Для построения графиков решетки на устройстве необходимо распечатать объект, созданный вызовом одной из графических функций решетки. Обычно при интерактивном использовании R автоматически печатает объекты, если они не назначены. Однако в циклах автоматическая печать не работает, поэтому необходимо организовать печать объекта, обычно путем его упаковки в print() .

Вот пример (пожалуйста, извините за злоупотребление обозначением формулы ;-):

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

Это создает три графика на pdf устройстве.

Комментарии:

1. Это частный случай cran.r-project.org/doc/FAQ / … (это немного сложнее выяснить, поскольку оригинальный плакат дал нам то, что, вероятно, не является реальным кодом, который они пытались запустить)

Ответ №2:

Является ли имя файла, содержащее «c:/», допустимым именем файла в вашей операционной системе? Это выглядит как часть рабочего каталога, который вы хотели бы установить перед вызовом pdf . Я получаю сообщение об ошибке, сообщающее мне, что он не может открыть этот файл:

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

Если я удалю бит «c: /» из имени файла, три PDF-файла будут сгенерированы правильно. Кроме того, если вы переместите dev.off() за пределы цикла for, вы получите один PDF-файл с тремя страницами вместо трех PDF-файлов. Может быть, а может и не быть тем, что вы хотите…

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

Комментарии:

1. setwd() , например: setwd("d:/my.dir") .

2. @Sir Ksilem — чтобы узнать, где находится текущий рабочий каталог, используйте getwd() . Для перехода в другой каталог используйте setwd('c:/path/to/new/directory') . Я полагаю, setwd() что могу работать как с абсолютными, так и с относительными каталогами, но это, вероятно, зависит от операционной системы. На страницах справки должно быть больше деталей.