Поскольку у меня нет ваших данных, я генерирую свои собственные наборы данных, используя mtcars
и iris
. Использование get(data)
в вызове ggplot должно решить вашу проблему. Обратите внимание, что вы должны предоставить все аргументы в виде строк. В вашем собственном примере вы уже используете aes_string
, поэтому x
и y
должны быть представлены в виде строк. Использование get
принимает строку в качестве аргумента и ищет объект в вашей глобальной среде.
library(dplyr)
library(ggplot2)
library(purrr)
mtcars_cyl <- mtcars %>% group_by(cyl) %>% summarise(count1 = n())
iris_Species <- iris %>% group_by(Species) %>% summarise(count1 = n())
pbar <- function(data, x, y) {
ggplot(data = get(data), aes_string(x = x, y = y)) + geom_bar(stat = 'identity')
}
l1 <- list("mtcars_cyl","cyl", "count1")
pmap(l1, pbar)
map2("cyl", "count1" )
l2 <- list("iris_Species", "Species", "count1")
pmap(l2,pbar)
Если вы всегда используете одну и ту же переменную y count1
. Тогда вы можете использовать map2
. Вот пример, где у вас есть два списка. Один список, ls_data
, предоставляющий кадры данных для зацикливания, и один список, ls_x
, предоставляющий аргумент x для ggplot2
. count1
затем определяется внутри лямбда-функции внутри map2
. Вызов map2
дал оба сюжета одновременно. В качестве альтернативы walk2
создаст графики без печати [[1]]
[[2]]
на консоли.
ls_data <- list("mtcars_cyl","iris_Species")
ls_x <- list("cyl","Species")
map2(ls_data, ls_x, ~ pbar(.x, .y, "count1"))
walk2(ls_data, ls_x, ~ pbar(.x, .y, "count1"))
Другой способ вызова map2 - поместить оба аргумента в именованный список с именем наборов данных в качестве имени списка и x-аргументом в качестве ввода списка.
args <- c(mtcars_cyl = "cyl",
iris_Species = "Species")
map2(names(args), args, ~ pbar(.x, .y, "count1"))
Удачи с вашими данными.