Lapply, печать png, ggplot2

Я пытаюсь распечатать выходные данные png (или pdf), используя ggplot и устройство png(). Это хорошо работает в отдельных случаях, но не тогда, когда я определяю его как часть функции. Смотрите мой воспроизводимый пример ниже:

# Define the data
test <- data.frame(title=sample(c("a", "b", "c"), 10, replace=T), author=sample(c("X", "Y", "Z"), 10, replace=T), 
                   topic = sample(c("economic", "social"), 10, replace=T), proportion = sample(seq(from = 0, to = 1, length.out = 1000), 10, replace=T))

# Define the first function
library(ggplot2)
produce.myheatmaps <- function(AUTHOR, AUTHOR.GREP, DF){
    ggplot(DF[grep(AUTHOR.GREP, DF$author),], aes(x=topic, y= proportion), fill=proportion) +
        geom_tile() +
        ggtitle(AUTHOR)
}

# This works as expected
produce.myheatmaps("John Doe","Z", test)

# Print - this works
png(file=paste("John Doe", ".png", sep=""),width=12000,height=6000, res=600)
produce.myheatmaps("John Doe", "Z", test)
dev.off()

# Now define a list of authors - which is how my original data is defined
my.authors <- list(
    c("Jane Doe", "Y"),
    c("John Doe", "Z")
)


# Define a second function to print several authors.
print.heat.map <- function(NAMES, DF){
    name <- NAMES[1]
    name2 <- NAMES[2]
    produce.myheatmaps(name, name2, DF)
    ggsave(file=paste(name, ".png", sep=""))
}

# This works too
print.heat.map(my.authors[[1]], test)


# I need (in my original problem) adjust the widht and height
#  I can do that for one author...
png(file=paste(my.authors[[1]][1], ".png", sep=""),width=12000,height=6000, res=600)
produce.myheatmaps(my.authors[[1]][1], my.authors[[1]][2], test)
dev.off()


## But this does not work when I define it to be part of a function
### Any idea why?
print.heat.map <- function(NAMES, DF){
    name <- NAMES[1]
    name2 <- NAMES[2]
    png(file=paste(name, ".png", sep=""),width=12000,height=6000, res=600)
    produce.myheatmaps(name, name2, DF)
    dev.off()
}

# This produces merely white pages
lapply(my.authors, print.heat.map, test)

Любые идеи о том, что здесь происходит?


person Adel    schedule 20.08.2015    source источник
comment
R FAQ 7.22, но также см. stackoverflow.com/questions/ 7034647/   -  person Brian Diggs    schedule 21.08.2015
comment
Спасибо Брайан! Это ответило на мой вопрос, и извините, что не заметил сообщение до публикации вопроса. Для справки будущих читателей. Это работает: print.heat.map ‹- function(NAMES, DF){ name ‹- NAMES[1] name2 ‹- NAMES[2] p ‹- product.myheatmaps(name, name2, DF) png(file=paste( имя, .png, sep=),ширина=12000,высота=6000, разрешение=600) print(p) dev.off() }   -  person Adel    schedule 21.08.2015