Ответ 1
Как насчет:
create.barplots <- function(...) {
x11()
plot.barplots(...) # create the barplot
dev.copy2pdf(file = "path/to/barplots.table.2.pdf")
}
Я написал функцию, которая создает барплот. Я хотел бы сохранить этот сюжет как pdf, а также отобразить его на экране (x11) при применении этой функции. Код выглядит следующим образом.
create.barplots <- function(vec)
{
x11() # opens the window
### Here is a code that creates a barplot and works perfectly
### but irrelevant for my question
dev.copy(pdf("barplots.table.2.pdf")) # is supposed to copy the plot in pdf
# under the name "barplots.table.2.pdf"
dev.off() # is supposed to close the pdf device
}
Это создает следующую ошибку: "устройство" должно быть функцией
Когда я меняю код на:
create.barplots <- function(vec)
{
x11()
### Here is a code that creates a barplot and works perfectly
### but irrelevant for my question
dev.copy(pdf) # This is the only difference to the code above
dev.off()
}
R отображает график и создает файл с именем Rplots.pdf. Это проблема из-за нескольких причин.
Я также пытался открыть устройства по-другому. Сначала откройте pdf-устройство, чем скопируйте содержимое pdf-устройства в устройство x11, чем настройте устройство pdf как активное, а затем закройте pdf-устройство. Код выглядит так:
create.barplots <- function(vec)
{
pdf("barplots.table.2.pdf") # open the pdf device
### Here is a code that creates a barplot and works perfectly
### but irrelevant for my question
dev.copy(x11) # copy the content of the pdf device into the x11 device
dev.set(which = 2) # set the pdf device as actice
dev.off() # close the pdf device
}
Проблема заключается в том, что wondow, который должен отображать график, пуст!
Подводя итог, у меня есть два вопроса: 1) Как сохранить график в формате pdf и отобразить его в x11 одновременно? А также 2) Как сохранить сюжет не в рабочем каталоге где-то еще?
ИЗМЕНИТЬ
Решения выше работают отлично. Но я все еще не понимаю, почему
pdf("barplots.table.2")
barplot(something)
dev.copy(x11)
отображает пустое серое окно вместо копирования содержимого pdf-устройства в оконном устройстве! Я также пробовал
pdf("barplots.table.2")
barplot(something)
dev.copy(window)
В том, что я тоже не смог...
Как насчет:
create.barplots <- function(...) {
x11()
plot.barplots(...) # create the barplot
dev.copy2pdf(file = "path/to/barplots.table.2.pdf")
}
Вы можете легко добавить аргументы для pdf
в вызов dev.copy
, например:
create.barplots <- function(vec,dir,file)
{
windows()
plot(vec)
dev.copy(pdf,file=paste(dir,file,sep="/")
dev.off()
}
dev.copy()
имеет аргумент... для передачи аргументов функции pdf, см. также ?dev.copy
. В качестве альтернативы вы можете использовать dev.copy2pdf
, как сказал Макс. Я также советую использовать windows()
вместо x11()
, иначе у вас могут возникнуть проблемы с семействами шрифтов. Значения по умолчанию для x11 и pdf не всегда совпадают.
Чтобы сохранить файл в другом каталоге, просто добавьте полный каталог (например, с помощью пасты, как в приведенной выше функции)
Как я уже упоминал в предыдущем сообщении, вы можете рассмотреть мой пакет knitr
; если вы используете его в интерактивном сеансе R, вы сможете увидеть графики в окне и сохранить их в pdf без каких-либо хаков (это поведение по умолчанию). Мне все еще нужно много усилий в документации и демонстрациях, но он должен иметь возможность работать с документом Rnw. Основная причина, по которой вы можете видеть графики и сохранять их в knitr
, - это knitr
, очень отличается от Sweave в дизайне - графическое устройство открывается после оценки кода, поэтому ваши графики не будут скрыты внеэкранное устройство. Опять же, я должен предупредить вас, что в настоящий момент он очень экспериментальный.
После работы хорошо для меня, когда вызывается из внутренних функций. Вызовите его после кода графика:
pdf2 <- function (file = "plot.pdf", w = 10, h = 7.07, openPDF = FALSE)
{
dev.copy2pdf(file = file, width = w, height = h, out.type = "pdf")
if(openPDF) browseURL(file)
}
NB. openPDF
может работать только в Windows с полным (не относительным) файловым путем.
Основываясь на ответе Макс Гаснера, я написал эту вспомогательную функцию, которая позволяет быстро переключаться с отображения и нет. Аргумент x является объектом сюжета или функцией, выполняющей чертеж.
savepdf<-function(x, file, display=TRUE) {
if (display){
x;
dev.copy2pdf(file=file)
}
else {
pdf(file=file)
x;
dev.off()
}
}
Пример:
savepdf(plot(c(1,2,3)), file="123.pdf", display=F)