2013-09-17 2 views
8

Мне было интересно, как наилучшим образом использовать семейство функций lapply famliy (или plyr), чтобы взять вектор, применить функцию к элементам и вернуть список, имена совпадают с значениями, указанными в первом аргументе. Так, например, если я делаю:lapply over vector, использовать значения как имена списков вывода

lapply(letters[1:3], function(x) NULL) 

[[1]] 
NULL 

[[2]] 
NULL 

[[3]] 
NULL 

Я хотел бы вернуться, вместо [[1]], [[2]], [[3]] в качестве имени (или скорее просто обычный индекс) списка, буквы «a», «b» и «c» в качестве имен выходного списка.

Я знаю, что могу сделать это (How to create a list with names but no entries in R/Splus?), чтобы создать список заранее с правильными именами, но мне интересно, могу ли я сделать это без предварительного создания списка с правильными именами.

Спасибо, Matt

ответ

11

sapply имеет USE.NAMES аргумент, который будет делать то, что вы хотите:

sapply(letters[1:3], function(x) NULL, simplify=FALSE, USE.NAMES=TRUE) 
# $a 
# NULL 

# $b 
# NULL 

# $c 
# NULL 

Как Джош О'Брайен отмечает в комментариях - и, как вы вычислили для улицы - simplify=FALSE предотвращает сокращение объема вывода до более простой структуры данных, сохраняя результаты в соответствии с тем, что вы получили бы с lapply (ну, кроме названий, конечно).

+0

Спасибо, что работает отлично! – mpettis

+1

Возможно также установить 'simplify = FALSE', чтобы сделать поведение более последовательным, например' lapply() 's. –

+0

Josh O'Brien: Я собирался ответить на проблему, когда я заменяю «Null» словом, скажем, строкой, она сворачивается из списка в вектор. Ваш комментарий адресует, что, спасибо. – mpettis

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