Значение по умолчанию для регулярного выражения в dplyr :: соответствия, которое никогда не выделяет столбцы - PullRequest
1 голос
/ 23 марта 2019

РЕДАКТИРОВАТЬ:

Как отмечает Divibisan, этот вопрос предоставляет ряд общих ответов регулярных выражений, которые были протестированы на Python.Я не уверен, что все они применимы в R. Выделенный ответ отмечен как трудоемкий;ответ с наибольшим количеством голосов не работает напрямую в этом примере.


Я пытаюсь подключить опцию, позволяющую пользователю выбирать переменные на основе регулярного выражения в пользовательской функции.Шаблон должен быть необязательным, но я не могу придумать надежного значения по умолчанию.

library(dplyr)

my_select <- function(..., pattern = "") {

  x <- enquos(...)

  mtcars %>% 
    select(!!!x, matches(pattern))


} 

my_select(cyl)
#> Error in matches(pattern): nchar(match) > 0 is not TRUE

NULL или любая другая логика также выдает ошибку, поскольку аргумент regex, передаваемый matches , должен быть строкой.

#> Error in matches(pattern) : is_string(match) is not TRUE 

На данный момент я собираюсь с " ", как я полагаю, это будет крайне редко ... но это, безусловно, возможно.

Есть ли способ обойти это или я должен просто избегать matches и написать свою собственную вещь в base?

Приветствия!

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Возможно, обходя суть вопроса, но вы также можете использовать некоторое значение по умолчанию и использовать if, чтобы поймать его:

library(dplyr)

my_select <- function(..., pattern = NULL) {

  x <- enquos(...)
  if (is.null(pattern)) {
    mtcars %>% 
      select(!!!x)
  }
  else {
    mtcars %>% 
      select(!!!x, matches(pattern))
  }

} 

my_select(cyl)
#>                     cyl
#> Mazda RX4             6
#> Mazda RX4 Wag         6
#> Datsun 710            4
#> Hornet 4 Drive        6
#> Hornet Sportabout     8
#> Valiant               6
#> Duster 360            8
#> Merc 240D             4
#> Merc 230              4
#> Merc 280              6
#> Merc 280C             6
#> Merc 450SE            8
#> Merc 450SL            8
#> Merc 450SLC           8
#> Cadillac Fleetwood    8
#> Lincoln Continental   8
#> Chrysler Imperial     8
#> Fiat 128              4
#> Honda Civic           4
#> Toyota Corolla        4
#> Toyota Corona         4
#> Dodge Challenger      8
#> AMC Javelin           8
#> Camaro Z28            8
#> Pontiac Firebird      8
#> Fiat X1-9             4
#> Porsche 914-2         4
#> Lotus Europa          4
#> Ford Pantera L        8
#> Ferrari Dino          6
#> Maserati Bora         8
#> Volvo 142E            4

Создано в 2019-03-22 представьте пакет (v0.2.1)

1 голос
/ 23 марта 2019

Как насчет ”^$”?

^ соответствует началу строки, а $ соответствует концу. Таким образом, ”^$” будет соответствовать только пустой строке, которая определенно не является допустимым именем переменной R.

grepl('^$', '')
[1] TRUE

grepl('$^', c('d', 'cat', '1', 's.s'))
[1] FALSE FALSE FALSE FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...