лиМожете ли вы передать grep() вектор шаблонов?
grep(c(pattern1, pattern2, pattern3), ...)
действует?
лиМожете ли вы передать grep() вектор шаблонов?
grep(c(pattern1, pattern2, pattern3), ...)
действует?
Мы можем проиллюстрировать пример. Вот несколько государственных сокращений по регионам.
south <- c('FL', 'TN', 'LA', 'GA')
west <- c('CA', 'NV', 'WA', 'AZ')
Давайте рассмотрим южные штаты с «A» или «L» в своих аббревиатурах.
y1 <- 'A'
y2 <- 'L'
Мы могли бы просто написать их в функцию grep
и разлучили их с характером трубы |
. Или мы могли бы практиковать использование имен переменных. Мы не получаем правильный вывод, если переменные объединяются.
grep('A|L', south, value=TRUE)
[1] "FL" "LA" "GA"
grep(paste(y1, y2, sep='|'), south, value=TRUE)
[1] "FL" "LA" "GA"
grep(c(y1, y2), south, value=TRUE)
[1] "LA" "GA"
Warning message:
In grep(c(y1, y2), south, value = TRUE) :
argument 'pattern' has length > 1 and only the first element will be used
Но есть еще больше. Что, если мы хотим найти южные штаты, которые имеют 'L'
, а западные штаты, которые имеют 'A'
? Мы должны были бы написать две функции, не так ли?
mapply(grep, list(y2, y1), list(south, west), value=TRUE)
[[1]]
[1] "FL" "LA"
[[2]]
[1] "CA" "WA" "AZ"
Все сделано за один шаг.
Нет, вы не можете. Но вы всегда можете быстро векторизовать функцию, используя Vectorize
(но иногда производительность не так уж велика).
Без векторизации:
grep(list("x1", "x2"), list("x1","x2")) # does not work
[1] 1
Warning message:
In grep(list("x1", "x2"), list("x1", "x2")) :
argument 'pattern' has length > 1 and only the first element will be used
векторизации:
Vectorize(grep)(list("x1", "x2"), list("x1","x2")) # it works
[1] 1 1
Или, если вы хотите, вы можете векторизации только конкретные аргументы:
Vectorize(grep, "pattern")(c("a","b","c"),c("aa","bb","cc","aa2"))
$a
[1] 1 4
$b
[1] 2
$c
[1] 3
Если вы собираетесь использовать много векторизованной версии, возможно, вам следует назначить их другим функциям:
vgrep <- Vectorize(grep)
vgrep(list("x1", "x2"), list("x1","x2"))
[1] 1 1
'lapply' /' sapply' будет более безопасным - например. - 'lapply (c (" a "," b "," c "), grep, x = c (" aa "," bb "," cc "," aa2 "))' vs. 'Vectorize (grep) (c («a», «b», «c»), c («aa», «bb», «cc», «aa2»)) ' – thelatemail
@thelatemail' Vectorize' векторизовал оба аргумента (это ' mapply' на 'pattern' и' x'), поэтому результат - это то, что мы ожидаем. Чтобы получить тот же результат, что и ваш 'lapply', нужно векторизовать только« шаблон », например« Vectorize (grep, «pattern») (c («a», «b», «c»), c («aa», "бб", "CC", "aa2")) '. –
Да, но не так –
R является интерактивным - просто попробуйте - 'grep (c (« a »,« b »,« c »),« бит символа »)' и прочитайте предупреждение. – thelatemail