передать объекты сетки в функцию R - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть эта простая функция, которая создает PDF-файл, содержащий некоторые объекты ggplot и grid. Я хотел бы также передать больше объектов сетки в функцию динамическим способом. Как мне этого добиться?

### required packages
library(ggplot2)
library(grid)

### create a sample ggplot object
sample_plot <- ggplot(data = mtcars, mapping = aes(x = wt, y = mpg)) +
  geom_point() +
  stat_smooth(method = 'lm', color = "#f44242", fill = "#fd9068")

### function which generates the PDF file
make_plot <- function(extra_params = NULL) {
 pdf("sample.pdf", 7, 5)
    for (i in 1:3) {
     print(sample_plot, vp = viewport(layout.pos.row = 1, layout.pos.col = 1))
     grid::grid.text("test", vp = viewport(layout.pos.row = 1, layout.pos.col = 1))
     extra_params
     if (i < 3) {
       grid::grid.newpage()
     }
 }
 dev.off()  
}

make_plot()

Например, если я попытаюсь передать объекты сетки в функцию как предопределенный список, ничего не произойдет:

extra <- list(
  grid::grid.text("test2", vp = viewport(layout.pos.row = 1, layout.pos.col = 1), y = 0.4),
  grid::grid.text("test3", vp = viewport(layout.pos.row = 1, layout.pos.col = 1), y = 0.3)
)

make_plot(extra)

Единственный способ получить желаемый результат, если я передам объекты сетки в функцию в качестве фиктивной функции, но это кажется мне действительно странным решением. Также я должен немного изменить исходную функцию:

extra <- function() {
  grid::grid.text("test2", vp = viewport(layout.pos.row = 1, layout.pos.col = 1), y = 0.4)
  grid::grid.text("test3", vp = viewport(layout.pos.row = 1, layout.pos.col = 1), y = 0.3)
}

make_plot <- function(extra_params) {
 pdf("sample.pdf", 7, 5)
    for (i in 1:3) {
     print(sample_plot, vp = viewport(layout.pos.row = 1, layout.pos.col = 1))
     grid::grid.text("test", vp = viewport(layout.pos.row = 1, layout.pos.col = 1))
     extra_params()
     if (i < 3) {
       grid::grid.newpage()
     }
 }
 dev.off()  
}

make_plot(extra) # works good
make_plot(function(){}) # empty case (without it it always throws an error message)

Я надеюсь, что у кого-то есть более правильное решение. Важно отметить, что меня интересуют только те решения, которые работают и с пустым регистром (например, make_plot (function () {}) в моем примере)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...