У меня есть эта простая функция, которая создает 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 () {}) в моем примере)