использование пользовательской функции ggplot в цикле переменных из списка

#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. Я добавил несколько источников в ответ. Надеюсь, это немного прояснит ситуацию!