Хотелось бы иметь сюжет как в формате pdf, так и в формате png:

pdf("test.pdf")
plot(sin, -pi, 2*pi)
dev.off()

png("test.png")
plot(sin, -pi, 2*pi)
dev.off()

Но я ищу уловку (желательно, не загружая новый пакет), в которой функция построения графика вызывается только один раз:

#no plot in pdf!
pdf("test1.pdf"); png("test1.png")
plot(sin, -pi, 2*pi)
dev.off(); dev.off()

Любое предложение будет оценено.

3
Ehsan Masoudi 7 Окт 2014 в 12:49

2 ответа

Лучший ответ

Вы можете использовать dev.copy() для своих целей. Например:

pdf("test.pdf")
a<-dev.cur()
png("test.png")
dev.control("enable")
plot(sin, -pi, 2*pi)
dev.copy(which=a)
dev.off()
dev.off()

Вы обращаете внимание на устройство pdf через dev.cur, а затем копируете график с устройства png на устройство pdf.

5
nicola 3 Фев 2019 в 01:21
1
Спасибо, я думаю, вы пропустили dev.control("enable"). Я добавил его.
 – 
Ehsan Masoudi
7 Окт 2014 в 14:19

Не уверен, имеет ли этот подход какие-либо преимущества перед ответом @nicolas, и технически он не отвечает на ваш вопрос, но, безусловно, демонстрирует преимущества нестандартная оценка R и решает вашу проблему простым способом:

save_plot <- function(p, file_name="test"){
  p <- substitute(p)
  pdf(paste0(file_name,".pdf"))
  eval(p)
  dev.off()

  png(paste0(file_name,".png"))
  eval(p)
  dev.off()

  eval(p) # if you don't also want to see your plot, change this to `invisible()`
}

save_plot(plot(sin, -pi, 2*pi))

На английском: напишите свою собственную функцию, которая принимает в качестве аргумента неоцененную команду построения графика и просто оценивает ее [= графики] один раз для каждого устройства.

0
jan-glx 18 Май 2017 в 12:14