2016-06-18 1 views
1

対象:POSIXltオブジェクトから取得したリストの最初の要素を出力する。抽出演算子 '[' - 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 

我々は、単一の抽出物を用いたX POSIXltオブジェクトにアクセスする場合、全体の日時が印刷されているが、我々は同様に別のリスト(TEMP)にアクセスするときに、最初の要素が印刷されます、リストとして(単一のブラケット抽出が同じオブジェクトを返すので)。最初の要素は、二重ブラケット抽出を使用するときに取得されますが、Rに新しく、誰でもこれについていくつかの光を当てることができますか?

+1

ここで問題となるのは、 'x'は単一の要素リストであり、' ['はリストのサブセットを表します。したがって、 'x [1]'は本質的に 'x'と同じオブジェクトで、' TRUE'を返す 'identical(x、x [1])'をチェックすれば検証できます。したがって、最初の要素を抽出するには 'x [[1]]'を使わなければなりません。これは 'length(x)== 1 'から' length(temp)== 3'までの間に 'x'と' temp'の類推を打破します。 – Psidom

+0

@Psidomもしそれが一つの要素リストであると言うなら、そのリストの最初の要素にアクセスするには、最初の要素自体として 'x [[1]] [[1]]'を使う必要はないでしょうリストですか? xをunclassすると、メインリストの要素(リスト)ではなく、そのリストのすべての要素が返されます。 –

+0

OK。これは確かに私が思ったより少し難解です。これについてもっと詳細な答えを出しました。 – Psidom

答えて

1

POSIXltオブジェクトを通常のリストから索引付けする際の異常な動作は、演算子がPOSIXltクラス用に定義されている方法に関連しています。 [.POSIXltというソースコードを見ると、直感的な方法で定義されています。リストをサブセット化するのではなく、リストをループして各要素を取り上げ、属性を再割り当てします。x[1]は本質的にxと同じです。だから、私のコメントはlength(l)によって返されます。これはlengthのクラスPOSIXltの機能がこのように定義されているためです。より慎重に2つの関数定義を確認し、動作が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> 

lengthPOSIXltための関数定義:

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

これは、配列や行列の次元を削除するために '[' 'が使われることを意味すると思いますが、ここでどのように動作するのかは分かりません。 –

関連する問題