2015-07-05 3 views
3

Я нашел этот код:sapply() с strsplit в R

string = c("G1:E001", "G2:E002", "G3:E003") 
> sapply(strsplit(string, ":"), "[", 2) 
[1] "E001" "E002" "E003" 

ясно strsplit(string, ":") возвращает векторы размера 3, где каждый компонент я является вектором размера 2, содержащего Gi и E00i.

Но почему еще два аргумента "[", 2 есть желание выбрать только те E00i? Насколько я вижу только аргументы, принимаемые функцией являются:

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 

ответ

2

Посмотрите на документы для ?sapply:

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 

FUN: the function to be applied to each element of ‘X’: see 
     ‘Details’. In the case of functions like ‘+’, ‘%*%’, the 
     function name must be backquoted or quoted. 

...: optional arguments to ‘FUN’. 

Там лежит ваш ответ. В вашем случае FUN - [. «Необязательные аргументы для fun» - «2» в вашем случае, так как в вашем вызове он соответствует .... Таким образом, в этом случае sapply вызывает [ со значениями в списке в качестве первого аргумента, а 2 - вторым. Рассмотрим:

x <- c("G1", "E001") # this is the result of `strsplit` on the first value 

Тогда:

`[`(x, 2)  # equivalent to x[2] 
# [1] "E001" 

Это то, что sapply делает в вашем примере, за исключением того, применяя к каждому вектору символов 2 длины возвращаемой strsplit.

2

Поскольку выход strsplit() список. «[» Обращается к элементам списка, а 2 указывает, что выбран второй элемент члена списка. Функция sapply() гарантирует, что это будет сделано для каждого члена списка. Здесь [ функция в sapply(), которая применяется к списку strsplit() и вызывается с дополнительным параметром 2.

> strsplit(string, ":") 
#[[1]] 
#[1] "G1" "E001" 
# 
#[[2]] 
#[1] "G2" "E002" 
# 
#[[3]] 
#[1] "G3" "E003" 
# 
> str(strsplit(string, ":")) 
#List of 3 
# $ : chr [1:2] "G1" "E001" 
# $ : chr [1:2] "G2" "E002" 
# $ : chr [1:2] "G3" "E003" 
4

Вы можете использовать sub, чтобы получить ожидаемый результат, вместо того, чтобы использовать strsplit/sapply

sub('.*:', '', string) 
#[1] "E001" "E002" "E003" 

Что касается вашего кода, strsplit вывод список и список могут быть обработаны с использованием семейных функций sapply/lapply/vapply/rapply и т. Д. В этом случае каждый элемент списка имеет длину 2 и мы выбираем второй элемент.

strsplit(string, ":") 
#[[1]] 
#[1] "G1" "E001" 

#[[2]] 
#[1] "G2" "E002" 

#[[3]] 
#[1] "G3" "E003" 

lapply(strsplit(string, ":"), `[`, 2) 
#[[1]] 
#[1] "E001" 

#[[2]] 
#[1] "E002" 

#[[3]] 
#[1] "E003" 

В случае sapply, опция по умолчанию simplify=TRUE

sapply(strsplit(string, ":"), `[`, 2, simplify=FALSE) 
#[[1]] 
#[1] "E001" 

#[[2]] 
#[1] "E002" 

#[[3]] 
#[1] "E003" 

[ можно заменить вызов анонимной функции

sapply(strsplit(string, ":"), function(x) x[2], simplify=FALSE) 
#[[1]] 
#[1] "E001" 

#[[2]] 
#[1] "E002" 

#[[3]] 
#[1] "E003" 
+2

Это не только замена, это эквивалент. 'x [2]' - это то же самое, что '\' [\ '(x, 2)' – thelatemail

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