tidy eval ggplot2 NSE неправильно отображается

Я пытаюсь написать функцию для передачи элементов в кавычках для построения нескольких ggplots. Следующий код отлично работает и делает то, что я хочу.

fig2.data %>% 
  ggplot(aes(x = Surgery, y = BALF_Protein, fill = Exposure)) +
  stat_summary(geom = "errorbar", fun.data = mean_se, position = "dodge") +
  stat_summary(geom = "bar", fun = mean, position = "dodge") +
  theme_classic() +
  scale_fill_manual(values=c("lightgrey","darkgrey")) +
  facet_grid(cols = vars(Duration))

введите здесь описание изображения

Используя это руководство, я создал следующую функцию и вызвал ее.

plotf <- function(x, y, fill, facet){
  
  x_var <- enquo(x)
  y_var <- enquo(y)
  facet_var <- enquo(facet)
  fill_var <- enquo(fill)
  
  ggplot(fig2.data, aes(x = !!x_var, y = !!y_var, fill = !!fill_var)) +
    stat_summary(geom = "errorbar", fun.data = mean_se, position = "dodge") +
    stat_summary(geom = "bar", fun = mean, position = "dodge") +
    theme_classic() +
    scale_fill_manual(values=c("lightgrey","darkgrey")) +
    facet_grid(cols = vars(!!facet_var))
}
plotf(x = "Surgery", y = "BALF_Protein", fill = "Exposure", facet = "Duration")

Мой график отображается без ошибок, но он не отображается так же. Что я делаю не так?

введите здесь описание изображения


person akaDrHouse    schedule 02.10.2020    source источник
comment
Пожалуйста, поделитесь образцами данных, чтобы воспроизвести ваш вопрос.   -  person Tung    schedule 02.10.2020
comment
Попробуйте без кавычек при вызове функции, т.е. plotf(x = Хирургия, y = BALF_Protein, fill = Exposure, facet = Duration)   -  person stefan    schedule 02.10.2020
comment
Другой вариант заставить функцию работать с именами переменных в кавычках — использовать !!sym(varname) или местоимение .data, т. е. ..data[[varname]]. В обоих случаях вам не нужно использовать enquo() ваши переменные.   -  person stefan    schedule 02.10.2020


Ответы (1)


Спасибо @Стефан

Я не понимаю, почему, но вызов, как вы предложили, сработал. Как это будет работать, когда я хочу перебрать вектор имен переменных для вызова функции, и они будут переданы в кавычках. Используйте 1_ ?

plotf(x = Surgery, y = BALF_Protein, fill = Exposure, facet = Duration)

ReproData здесь с некоторыми rnorm(), поэтому ваш график может немного отличаться по высоте.

fig2.data <- structure(list(Surgery = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("SHAM", "HEP VAG"
), class = "factor"), Exposure = structure(c(1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Air", 
"Ozone"), class = "factor"), Duration = structure(c(2L, 2L, 2L, 
2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("1d", 
"2d"), class = "factor"), BALF_Protein = c(64.2302655135303, 
75.8662498743628, 66.944160651771, 64.3494818599307, 93.5733806883362, 
93.9843061725941, 94.9296956493259, 85.5985055395191, 80.4974511604734, 
70.6316004306272, 85.3439438112908, 79.4666853120619, 84.7319693413318, 
224.606438793638, 78.4487502522719, 78.2128699744882, 92.0151032176434, 
79.2127901600167, 83.0909690767245, 92.0325415462662, 60.6200784843927, 
97.7183404856683, 68.7510921525122, 41.9625493809036, 311.769822036931, 
450.597937801349, 283.639976251784, 190.840750069959, 187.810222461528, 
203.735530975931, 547.003463243173, 517.871472878502, 164.167773487012, 
202.777306107217, 666.896662547508, 361.46103562071, 270.119121964956, 
234.635143377769, 94.4541075117046, 91.1060986818939, 142.774777316869, 
300.021992736686, 279.775933301683, 246.554185364089, 298.964364163939, 
193.737945537319, 232.918974192744, 150.384203703162)), row.names = c(NA, 
-48L), class = "data.frame")
person akaDrHouse    schedule 02.10.2020
comment
Это может помочь stackoverflow.com/a/52045613/786542 - person Tung; 03.10.2020