Как создать список с именами, но без записей в R/Splus?

Я хотел бы создать список с именованными записями, значения которых не инициализированы (я планирую добавить к ним что-то позже). Как люди обычно это делают? Я сделал:

mylist.names <- c("a", "b", "c")
mylist <- as.list(rep(NA, length(mylist.names)))
names(mylist) <- mylist.names

но это кажется хакерским. Должен быть более стандартный способ сделать это... верно?


person lowndrul    schedule 16.04.2011    source источник
comment
Смутно связано: stackoverflow.com/questions/5042806/   -  person Andrie    schedule 16.04.2011


Ответы (3)


Я бы сделал это так:

mylist.names <- c("a", "b", "c")
mylist <- vector("list", length(mylist.names))
names(mylist) <- mylist.names
person Thilo    schedule 16.04.2011
comment
Есть функция установки имен: setNames(vector("list", length(mylist.names)), mylist.names). - person Marek; 18.04.2011
comment
Это всегда зависит от того, что вы хотите заархивировать. Обычно я люблю разбивать шаги, чтобы упростить чтение кода. R/Splus, как правило, позволяет вам писать довольно много материала в одной строке, что хорошо для тестирования и быстрого выполнения, но плохо для удобочитаемости. - person Thilo; 18.04.2011

Немного более короткая версия, чем Thilo :)

mylist <- sapply(mylist.names,function(x) NULL)
person Wojciech Sobala    schedule 17.04.2011
comment
Мне это нравится. Следует добавить одну вещь: если ваши имена являются числами, числовые значения игнорируются как имена, и используются только 1, 2, 3.... Чтобы обойти это, попробуйте: sapply(as.character(4:6),function(x) NULL) - person mpettis; 12.09.2013
comment
Остерегайтесь использования sapply внутри функции twitter.com/hadleywickham/status/434339083871993856 - person Jubbles; 20.01.2016
comment
Вы можете заменить sapply на purrr::map, используя mylist <- purrr::map(mylist.names, ~ NULL) - person psychonomics; 13.04.2017
comment
Однако затем вам нужно использовать names(mylist) <- mylist.names - person psychonomics; 13.04.2017
comment
Лучшее обоих миров? lapply(mylist.names, function(x) NULL) %>% setNames(mylist.names) - person hmhensen; 17.12.2018

Еще один хитрый способ сделать это:

mylist.names <- c("a", "b", "c") 

mylist <- NULL
mylist[mylist.names] <- list(NULL)

Это работает, потому что вы заменяете несуществующие записи, поэтому они создаются. Список (NULL), к сожалению, требуется, поскольку NULL означает УДАЛИТЬ запись:

x <- list(a=1:2, b=2:3, c=3:4)
x["a"] <- NULL # removes the "a" entry!
x["c"] <- list(NULL) # assigns NULL to "c" entry
person Tommy    schedule 03.08.2011
comment
Я бы, вероятно, использовал mylist <- list(), потому что он более четко показывает, что вы инициализируете пустой список. На самом деле я несколько удивлен, что он работает с установкой NULL. Я предполагаю, что mylist продвигается из NULL в список, когда вы назначаете ему таким образом. - person Brian Diggs; 04.07.2014