#r #ggplot2
#r #ggplot2
Вопрос:
Я хочу использовать очень простой пользовательский вызов ggplot2 внутри цикла. Взяв список переменных из фрейма данных для подачи моей функции, я хочу получить график для каждой переменной.
Это упрощенный пример только для иллюстрации моей проблемы. Реальная функция более сложная.
Одна функция работала нормально, но внутри цикла не работает.
library(rlang)
library(ggplot2)
gg_hist <- function(data, x){
ggplot(data,
aes(x = {{ x }} ))
geom_histogram()
}
# This works ok
gg_hist(mtcars, hp)
# my list of variables to loop
vars <- c("mpg","hp")
for (variable in vars) {
p <- gg_hist(mtcars, {{ variable }})
print(p)
}
# unquoting list of variables not working either
vars <- c(mpg,hp)
Комментарии:
1. Вы можете использовать
quos
. Либоvars <- quos(mpg, hp)
, а затем вашfor
цикл. Или что-то вродеlapply(quos(mpg, hp), gg_hist, data = mtcars)
. В качестве альтернативы, используйтеaes_
илиaes_string
вместоaes
, все зависит от предпочтений.
Ответ №1:
Если по какой-либо причине вы не хотите иметь возможность передавать параметры без кавычек, я бы изменил функцию так, чтобы она допускала только строки и использовала местоимение .data[[]], что является рекомендуемым способом в последних версиях dplyr и ggplot. Его цель очевидна для чтения при сравнении с кавычками и ударами !! (Хотя кто-то может утверждать обратное).
library(ggplot2)
gg_hist <- function(data, x){
ggplot(data,
aes(x = .data[[x]] ))
geom_histogram()
}
gg_hist(mtcars, "hp") # Note now I use "hp" and not hp
vars <- c("mpg","hp")
for (variable in vars) {
p <- gg_hist(mtcars, variable)
print(p)
}
Основным источником для этого будет официальная документация dplyr. Это правда, что это не источник gpplot2, но большая часть того, что там объясняется, применима. Другим источником для ggplot2, в частности, являются слайды rconf2020. Надеюсь, это поможет.
Комментарии:
1. Это сработало нормально, но я был бы очень благодарен за добавление ссылок на документацию по этой неясной концепции
2. Я добавил несколько источников в ответ. Надеюсь, это немного прояснит ситуацию!