2016-03-20 2 views
0

Этот код работает, но не останавливается, и я не могу получить файлы, которые будут сохранены в папке «graph» на моем Mac.Невозможно автоматизировать сохранение фигур в R из разделов базы данных?

i <- 1L 
for (i in 1:nrow(p)) { 
mypath <- file.path("/Users/atreyu/Desktop/graphs/",paste("DATA_", i, ".jpg", sep = "")) 
jpeg(file=mypath) 
dsmall <- p[i:(i+10),] 
qplot(dsmall$o, dsmall$t) 
dev.off() 
i <- i+10 
} 

В принципе, я хочу создать галерею рисунков, сделанных по разделам моих данных. Каждый раздел состоит из 10 строк.

Код находится в R, а p - это кадр данных, содержащий около 100 тыс. Строк. Как я могу написать более эффективный код?

UPDATE:

Я изменил код на следующее (я просто хочу знать, как сделать цикл для сохранения графиков, и я до сих пор не могу показаться, чтобы иметь возможность сохранить графики, я могу сохранить один граф, но не используя цикл)

for (i in 1:(nrow(p))) 
{ 
mypath <- file.path("/Users/atreyu/Desktop/graphs",paste("DATA_", i, ".jpg", sep = "")) 
dsmall <- p[i:(i+10),] 
jpeg(filename = mypath) 
qplot(dsmall$c, dsmall$t) 
dev.off() 
} 

UPDATE 2:

Я понял, что это работает:

for (i in 1:(nrow(p))) 
{ 
mypath <- file.path("/Users/atreyu/Desktop/graphs") 
dsmall <- p[i:(i+10),] 
jpeg(filename = paste(mypath,"DATA_", i, ".jpg", sep = "")) 
plot(dsmall$c, dsmall$t) 
dev.off() 
} 

Я понял, что вы можете сделать цикл на сюжете, но не на qplot. Как это странно?

+0

Вы должны ** ** сильно пересмотрит создание 100000 графических файлов. Во-первых, зачем? Вы не могли бы посмотреть все эти файлы, так что это кажется немного бесполезным. Но не менее важно то, что 100000 файлов в одном и том же пути будут существенно облагать файловыми системами: файловые системы оптимизированы для относительно небольшого количества файлов на узел. Наличие так много в одном каталоге замедляет файловую систему до обхода. (EDIT: Ах, это должно создать только 10000 файлов. Это будет меньше проблем для файловой системы, но я думаю, что это тоже необоснованно.) –

+0

У меня есть веская причина для этого. Эти файлы будут замаскированы, замарины и поданы в другое программное обеспечение. R, здесь используется только для этих фигур. Вы предлагаете лучшее программное обеспечение (кроме R) для этого. Я не человек R и сегодня взял R, чтобы это сделать, потому что я не мог найти лучшего программного обеспечения для этого? – Antaeus

+1

R не проблема. Проблемы - это две вещи, о которых я упомянул в своем предыдущем комментарии. Честно говоря, нисходящее программное обеспечение кажется плохо задуманным: почему он вместо этого не принимает * необработанные данные * и создает нужные графики на лету? –

ответ

1

Сначала удалите:

i <- i+10 

Никогда не изменять счетчик цикла, если вы не используете while петлю.

Изменить

dsmall <- p[i:i+9,] 

в

dsmall <- p[i:(i+9),] 

Это требует то, что:

for (i in 1:nrow(p)) 

идет в:

for (i in 1:(nrow(p)-9)) 

Наконец, чтобы действительно помочь, это здорово, чтобы дать образец данных с помощью:

dput(data_here) 

Редактировать

За обсуждение в комментариях, спрашивающий действительно хочет изменить индекс i следующим образом:

for(i in seq(1, nrow(p), by = 10)) 

Redux

Ниже приводится 92 отдельных графика в каталоге user (~/).

library(ggplot2) 
n = 1e2 
p = data.frame(c = rnorm(n), t = rnorm(n)) 

for (i in 1:(nrow(p)-9)) { 
    mypath <- file.path("~",paste0("DATA_", i, ".jpg")) 
    dsmall <- p[i:(i+9),] 
    a = qplot(dsmall$c, dsmall$t) 
    ggsave(mypath, a) 
} 

Пожалуйста, убедитесь, что вы создали каталог для экспорта через:

dir.create("/Users/atreyu/Desktop/graphs", recursive = T) 
+0

Я хочу, чтобы каждый раз прыгать по 10 строк, я не хочу, чтобы он перескакивал один за другим? Тогда вы предлагаете не использовать для цикла и идти за циклом тогда, правильно? – Antaeus

+0

Итак, вы хотите прыгать по 10 строк каждый раз? Затем вы должны использовать: 'seq (1, nrow (p), by = 10)', что даст следующие значения для 'i': ' [1] 1 11 21 31 41 51 61 71 81 91 ' – coatless

+0

Если вы хотите, чтобы' i' увеличивалось на 10, вам нужно будет переключить '1: nrow (p)' на то, что я упомянул выше. Кроме того, вы захотите переключить подмножество '(i + 10)' на '(i + 9)', чтобы избежать выхода за пределы последней итерации. – coatless

Смежные вопросы