R делает функцию устойчивой как к стандартной, так и к нестандартной оценке

У меня есть небольшая функция, которая выполняет поиск, хотя пользователь определяет column фрейма данных, полагаясь на dplyr. В текущей форме ниже он принимает аргумент столбца в нестандартной оценке - без кавычек (например, scenario вместо "scenario" в стандартной оценке).

search_column <- function(df, column, string, fixed = TRUE){
      df <- dplyr::select_(df, deparse(substitute(column)))
      df <- distinct(df)

      return(grep(string, df[[1]], fixed = fixed, value = TRUE))
    }

Есть ли способ заставить функцию работать независимо от того, как пользователь вводит имя столбца, т.е. в стандартной или нестандартной оценке?


person roming    schedule 21.01.2016    source источник


Ответы (1)


Я бы предложил просто удалить дополнительные кавычки, добавляемые deparse к строковому вводу, в этом случае это приведет к идентичному результату, и ваш код будет работать для любого ввода

Сравните 3 возможных входа

gsub('"', "", deparse(substitute("mpg")))
[1] "mpg"
gsub('"', "", deparse(substitute('mpg')))
[1] "mpg"
gsub('"', "", deparse(substitute(mpg)))
[1] "mpg"

Таким образом, решение может заключаться в том, чтобы просто изменить вашу первую строку на

df <- dplyr::select_(df, gsub('"', "", deparse(substitute(column))))
person David Arenburg    schedule 21.01.2016
comment
В качестве примечания: я не большой поклонник трубок, но вы, вероятно, могли бы передать свой код в функцию более dplyr идиоматическим способом - это осчастливит Хэдли. - person David Arenburg; 21.01.2016
comment
не уверен, как использовать канал dplyr %>% в функциях. Как это: dplyr::"%>%"? - person roming; 21.01.2016
comment
После загрузки dplyr вам не нужно использовать dplyr::, если только вы не хотите, чтобы он работал без загрузки dplyr? - person David Arenburg; 21.01.2016
comment
Ну, поскольку я - конечно же - хочу осчастливить Хадли, я использовал этот способ обращения к функциям, поскольку он рекомендуется сюда - person roming; 21.01.2016
comment
У вас есть точка там. Во всяком случае, я в основном пошутил - это ваш выбор. - person David Arenburg; 21.01.2016
comment
Также стоит помнить, что: Если вы используете функции неоднократно, вы можете избежать ::, импортировав функцию с @importFrom pgk fun. Это также дает небольшой выигрыш в производительности, поскольку :: увеличивает время оценки функции примерно на 5 мкс. (Из второго абзаца раздела функций R) - person NGaffney; 22.01.2016