2016-11-30 2 views
0

Мне нужна функция is_named_list(lst), которая возвращает true, если все элементы в списке имеют имя и false в противном случае. В случае, когда список пуст, он должен возвращать значение false. Какие соображения я должен учитывать при попытке написать такую ​​функцию. Например, список, без имен ведет себя по-разному в список с неполными именами, относительно names функции:Как проверить, что каждый элемент списка имеет имя?

> tmp_list <- list(a = 1, b = 2, 3) 
> names(tmp_list) 
[1] "a" "b" "" # empty string for unnamed third element 

> tmp_list <- list(1, 2, 3) 
> names(tmp_list) 
NULL # null value when no elements have names. 

ответ

3

Просто сравните длину списка (length(tmp_list)) от длины вектора имен для этого список (length(names(tmp_list))), где имена не пустая строка.

all_names <- function(list) { 
    return(length(list) == sum(names(list) != "", na.rm=TRUE)) 
} 

> all_names(tmp_list) 
[1] FALSE 
+0

@Alex К сожалению, ответить на обновленный. –

0

Мы можем попробовать

is_named_list <- function(lst) { 
    !(is.null(names(lst))|any(!nzchar(names(lst)))) 
} 
is_named_list(tmp_list) 
#[1] FALSE 

и для второго примера

tmp_list <- list(1, 2, 3) 
is_named_list(tmp_list) 
#[1] FALSE 
+0

Почему этот ответ был downvoted? – Alex

+0

@Alex Идея, это один из тех голосов троллей. – akrun

0
is_named_list <- function(lst) { 
    all(names(tmp_list) != "") & !is.null(names(tmp_list)) 
} 

tmp_list <- list(a = 1, b = 2, 3) 
is_named_list(tmp_list) 
#FALSE 
tmp_list <- list(1, 2, 3) 
is_named_list(tmp_list) 
#FALSE 
tmp_list <- list(a = 1, b = 2, c = 3) 
is_named_list(tmp_list) 
#TRUE 
Смежные вопросы