2015-06-18 3 views

ответ

2

Мы можем проиллюстрировать пример. Вот несколько государственных сокращений по регионам.

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" 

Все сделано за один шаг.

0

Нет, вы не можете. Но вы всегда можете быстро векторизовать функцию, используя 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 
+0

'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

+0

@thelatemail' Vectorize' векторизовал оба аргумента (это ' mapply' на 'pattern' и' x'), поэтому результат - это то, что мы ожидаем. Чтобы получить тот же результат, что и ваш 'lapply', нужно векторизовать только« шаблон », например« Vectorize (grep, «pattern») (c («a», «b», «c»), c («aa», "бб", "CC", "aa2")) '. –

Смежные вопросы