Я пытаюсь обдумать различные синтаксисы quo / unquo и то, когда каждый из них следует использовать.
Я в основном пишу функции, которые передают фрейм данных и столбцы для использования в качестве аргумента - для построения графика с использованием ggplot или для суммирования / управления данными с помощью dplyr (group_by, summarize, mutate ect). Однако иногда мне также приходится использовать функцию, которая не использует NSE в моей общей функции.
Из того, что я прочитал, я понимаю, что:
1) если я ссылаюсь на столбец в фрейме данных, мне не нужно фиксировать среду, и я могу использовать ensym
или sym
. Это правильно? Возникнет ли проблема с использованием enquo
или в этом нет необходимости?
2) если я использую ensym
, пользователь может технически ввести в аргумент как строку, так и пустое имя столбца.
Исходя из этого, моя типичная настройка функций будет выглядеть примерно так:
library(tidyverse)
dataset <- mtcars
myfun <- function(dat, xvar, yvar, group){
#either manipulate data
x <- dat %>% group_by(!!ensym(group)) %>%
mutate(new = !!ensym(xvar)*5) %>%
summarize(medianx=median(!!ensym(xvar), na.rm=TRUE),
median_new=median(new, na.rm=TRUE))
#or plot data
p <- ggplot(dat, aes(x=!!ensym(xvar), y=!!ensym(yvar))) +
geom_point()
#sometime require referencing the column with NSE function..
median(dat[[xvar]]) #works if require string in argument
#how would you reference this with bare argument column? Convert ensym to string?
median(dat[[?????]])
}
#both work with ensym, only the later with sym
myfun(dataset, xvar=mpg, yvar=disp, group=cyl)
myfun(dataset, xvar="mpg", yvar="disp", group="cyl")
Как преобразовать аргумент или символ пустого столбца в строку для использования в последней строке myfun выше? Я попробовал rlang::as_string(!!ensym(xvar))
, но это не сработало.