Хотелось бы иметь сюжет как в формате 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()
Любое предложение будет оценено.
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
.
Не уверен, имеет ли этот подход какие-либо преимущества перед ответом @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))
На английском: напишите свою собственную функцию, которая принимает в качестве аргумента неоцененную команду построения графика и просто оценивает ее [= графики] один раз для каждого устройства.
Похожие вопросы
Связанные вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.