2016-02-18 3 views
2

Попытка сгладить список в вектор Я только что нашел неожиданное поведение. Для упрощения давайте делать то, что ?unlist предлагает в качестве примера:r unlist функция неожиданные результаты

unlist(options()) 

Посмотрите на оригинальный размер списка:

length(unlist(options())) # 69 in my environment 

Если Unlisted список сохраняют свою длину? Я бы так подумал, но ...

length(unlist(options())) # 79!!! 
length(unlist(options(), use.names = F)) # Another 79 

Что происходит? Мне нужно сохранить значения списка, но unlist() дает мне дополнительную информацию.

+1

Но 'sum (lengths (options())) == 79'. 'unlist' делает то, что он должен делать. Некоторые элементы 'list' содержат более одного элемента. – A5C1D2H2I1M1N2O1R2T1

+0

Спасибо @AnandaMahto. Я нашел эту «проблему» в большом наборе данных, но с небольшими опциями() «Я не мог этого видеть. –

+0

Иногда меньший пример помогает более четко видеть поведение. Надеюсь, что пример моего ответа помог вам прояснить это. – A5C1D2H2I1M1N2O1R2T1

ответ

0

Это связано с тем, что некоторые элементы списка могут иметь более одного значения. Таким образом, unlist делает именно то, что его просят сделать.

Посмотрите на следующие примеры:

L <- list(1, c(1, 2, 3), 1, c(4, 5)) 
length(L)   # 4  <<< How many list elements are there? 
length(unlist(L)) # 7  <<< How many elements are there within the list? 
lengths(L)  # 1 3 1 2 <<< How many elements are in each list element? 
sum(lengths(L)) # 7  <<< How many elements should we expect from unlist? 

Если вы только ожидали, первое значение для каждого, вы можете извлечь, что в одиночку, используя что-то вроде:

sapply(L, `[[`, 1) 
# [1] 1 1 1 4 

(Какой вектор, равный длина списка, но имеет достаточное количество данных).

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