2016-06-18 2 views
1

Цель: напечатать первый элемент списка, полученный из объекта POSIXlt.Extract operator '[' - POSIXlt unclassed list prints datetime

Код:

> x <- as.POSIXlt(Sys.time()) 
> x 
[1] "2016-06-18 23:51:14 IST" 
> x[1] 
[1] "2016-06-18 23:51:14 IST" 
> x[[1]] 
[1] 14.70887 
> temp <- list(999,23,3) 
> temp[1] 
[[1]] 
[1] 999 
> temp[[1]] 
[1] 999 

Когда доступ к объекту POSIXlt х с использованием одного экстракта, вся дата-время печатается, но когда мы так же получить доступ к другому списку (TEMP), то первый элемент печатается , как список (в качестве одного экземпляра скобки возвращает тот же объект). Первый элемент, хотя и извлекается, когда я использую экстракт двойной скобки. Новым для R, так может кто-нибудь пролить свет на это?

+1

Проблема заключается в том, что 'x' - это один список элементов, а' ['обозначает подмножество списка. Итак, 'x [1]' по существу тот же объект, что и 'x', который можно проверить, если вы проверите' идентичный (x, x [1]) ', который возвращает' TRUE'. Поэтому вам нужно будет использовать 'x [[1]]' для извлечения первого элемента. Это также нарушает аналогию, которую вы делаете между 'x' и' temp', поскольку 'length (x) == 1' while' length (temp) == 3'. – Psidom

+0

@Psidom, если вы говорите, что это список из одного элемента, то для доступа к первому элементу этого списка нам не нужно будет использовать 'x [[1]] [[1]]', поскольку сам первый элемент это список? И когда мы открываем x, мы возвращаем все элементы этого списка, а не единственный элемент (список) основного списка? –

+0

ОК. Это действительно немного сложнее, чем я думал. Просто сделал более подробный ответ на этот вопрос. – Psidom

ответ

1

Необычное поведение индексации объекта POSIXlt из обычного списка связано с тем, как определяется оператор [ для класса POSIXlt. Если вы посмотрите на исходный код [.POSIXlt, вы обнаружите, что он определен довольно интуитивно понятным способом. Вместо подмножества списка он перебирает список, выбирает каждый элемент и переназначает атрибут назад, который делает x[1], по существу, таким же, как x. Поэтому мой комментарий был введен в заблуждение length(l), который возвращает его, потому что функция length для класса POSIXlt определена таким образом. Проверьте определение две функции более тщательно, и вы поймете, почему поведение не как обычно list:

[ определение функции POSIXlt:

`[.POSIXlt` 
function (x, ..., drop = TRUE) 
{ 
    val <- lapply(X = x, FUN = "[", ..., drop = drop) 
    # note how the above line has looped through the original list and collected all of them 
    attributes(val) <- attributes(x) 
    val 
} 
<bytecode: 0x105dc90d8> 
<environment: namespace:base> 

length определение функции POSIXlt:

length.POSIXlt 
function (x) 
length(x[[1L]])  # this will always return one 
<bytecode: 0x102270a68> 
<environment: namespace:base> 

А также поскольку [[ не определен для класса POSIXlt, он по-прежнему будет вести себя как обычный список Сделаю.

+0

В '.POSIXlt', почему бы просто не вернуть' x'? Когда по существу оба «x [1]» и «x» одинаковы. –

+0

@AdityaAgrawal Я подожду старшего пользователя 'R', чтобы ответить на ваш вопрос. Но также обратите внимание, что функция позволяет вам передать параметр 'drop'. – Psidom

+0

Я бы предположил, что это предназначено для '[' для удаления размеров массива или матрицы, но я не уверен, как это работает здесь. –