2009-08-30 13 views
7

У меня есть набор данных опроса, и я хотел бы генерировать графики определенной переменной, сгруппированные по стране респондента. Код, который я написал для создания участков до сих пор:Получение foreach() и ggplot2 для того, чтобы обойти

countries <- isplit(drones, drones$v3) 
foreach(country = countries) %dopar% { 
    png(file = paste(output.exp, "/Histogram of Job Satisfaction in ", country$key[[1]], ".png", sep = "")) 
    country.df <- data.frame(country) #ggplot2 doesn't appreciate the lists nextElem() produces 
    ggplot(country.df, aes(x = value.v51)) + geom_histogram() 
    dev.off() 
} 

Действительно странная вещь? Я могу запустить isplit(), установить country <- nextElem(countries), а затем запустить код без отправки строки foreach - и получить прекрасный сюжет. Если я отправлю foreach, я получу пустые .png-файлы.

Заранее за вашу помощь.

Я могу определенно сделать это со стандартными петлями R, но мне очень хотелось бы лучше понять foreach.

+0

Не могли бы вы разместить некоторые данные образца? Было бы намного легче протестировать. –

+0

Конечно. Данные о честности и доброте: http://drop.io/cy81s4w/asset/sample-data-rdata –

+0

Надеюсь, что использование реальных данных в порядке - немного необычно, но кажется наиболее эффективным. Просто используйте load (file.choose()) для ввода этих данных в R, затем drones <- sample. Вам также нужно будет установить output.exp в какую-то папку, в которой вы хотели бы показать 19 .png-файлов. –

ответ

9

Вы должны print сюжет, если вы хотите, чтобы дисплей:

print(ggplot(country.df, aes(x = value.v51)) + geom_histogram()) 

По умолчанию команды ggplot возврата объекта сюжет, но сама команда на самом деле не показывать сюжет; это делается с помощью команды print. Обратите внимание, что при запуске кода в интерактивном режиме результаты команд печатаются, поэтому вам часто не нужен явный отпечаток. Но при обертывании в foreach вам нужно явно напечатать, так как результаты команд в теле не будут эхом.

+8

В качестве альтернативы, используйте 'ggsave' – hadley

+0

Джонатан, спасибо за объяснение - это, скорее всего, спасет меня и в будущем. Хэдли, спасибо за упоминание (и, собственно, и письмо) ggsave() - это гладко. –