Подтвердить что ты не робот

Как остановить R от создания пустого файла Rplots.pdf при использовании ggsave и Rscript

У меня есть R script, который сохраняет некоторые графики, используя ggsave. Когда я запускаю script из командной строки, он не только сохраняет мои графики, но и пустой файл Rplots.pdf. Как я могу предотвратить создание R этого ненужного файла?

Вот пример script, который воспроизводит ошибку:

#!/usr/bin/env Rscript

# Code that creates unnecessary Rplots.pdf file
library(ggplot2)
my.data <- data.frame(x = 1:10, y = 1:10)
my.plot <- qplot(x, y, data = my.data)
ggsave('example.png', my.plot) 

Все следующие способы запуска script создают ненужный файл:

Rscript script.R
Rscript --vanilla script.R
chmod a+x script.R
./script.R 

Кроме того, когда я отправляю код из интерактивного сеанса, открывается ненужное пустое окно R Graphics Device.

Кроме того, у меня нет этих проблем, если вместо ggsave я использую следующий более подробный код:

#!/usr/bin/env Rscript

# Code that does NOT create unnecessary Rplots.pdf file
library(ggplot2)
my.data <- data.frame(x = 1:10, y = 1:10)
my.plot <- qplot(x, y, data = my.data)
png(file = 'example.png')
print(my.plot)
dev.off()

Вот моя информация о сеансе (что то же самое, работает ли Rscript или интерактивно):

R version 3.0.1 (2013-05-16)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] methods   stats     graphics  grDevices utils     datasets  base     

other attached packages:
[1] ggplot2_0.9.3.1

loaded via a namespace (and not attached):
 [1] colorspace_1.2-2   dichromat_2.0-0    digest_0.6.3       grid_3.0.1        
 [5] gtable_0.1.2       labeling_0.1       MASS_7.3-26        munsell_0.4       
 [9] plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5 reshape2_1.2.2    
[13] scales_0.2.3       stringr_0.6.2   
4b9b3361

Ответ 1

Если вы посмотрите на значения по умолчанию для аргументов ширины и высоты в ggsave, вы увидите, что они par("din")[1] и par("din")[2]. Если вы запустите это в консоли, вы увидите, что он открывает графическое окно, если оно еще не открыто.

Такой подход имеет смысл, поскольку для того, чтобы получить ширину/высоту устройства в дюймах, вам нужно действительно устройство. Полагаю, можно утверждать, что par("din") должен возвращать ошибку, если ни одно устройство не открыто, и в этом случае Хэдли наверняка написал бы ggsave по-разному.

Действительно, из ?par:

Если текущее устройство является нулевым устройством, par откроет новое устройство перед параметрами запроса/настройки.

Следовательно, указание ширины/высоты предотвратит открытие ложного устройства.

Ответ 2

У меня тоже была эта проблема, но решения здесь ее не решали. Я создал свой сюжет, но не сохранил его, как в переменной. ggsave сохранит последнюю фигуру, поэтому я не думал, что мне нужно. Если вы сохраните график в переменной, а затем выполните ggsave (даже без явного указания графика, он не будет генерировать файл Rplots.pdf.

Пример кода:

Библиотека (ggplot2) библиотека (далекая)

ff_lmer <- ggplot(ff, aes(x = thorax, y = longevity, color = activity)) +
  geom_point() +
  geom_smooth(method = lm, se = FALSE)

ggsave("fig/ff_lmer.pdf", width = 5, height = 5)

Информация о сеансе "

R версия 3.3.2 (2016-10-31) Платформа: x86_64-apple-darwin13.4.0 (64-разрядная версия) Запуск под: macOS Sierra 10.12.2

ggplot2_2.2.1.9000