2017-11-15 8 views
1

sapplyまたはvapplyのように、Rから機能するベクトルを適用した後にオブジェクトの属性(クラスなど)を保持するにはどうすればよいですか?Rは属性を保持する関数を適用する

> d <- c(as.POSIXct(Sys.time()), as.POSIXct(Sys.time()) + 60) 
> typeof(d) 
[1] "double" 
> class(d) 
[1] "POSIXct" "POSIXt" 

> sapply(d, function(x) x) 
[1] 1510760756 1510760816 
> vapply(d, function(x) x, double(1)) 
[1] 1510760756 1510760816 

私は

> do.call(c, as.list(d)) 
[1] "2017-11-15 16:45:56 CET" "2017-11-15 16:46:56 CET" 

でこの問題を回避することができますが、その後、私は最初のリストを構築する必要があります。

ありがとうございました!

+2

これはちょうどそれらを維持するのではなく、戻ってそれらを置きますが、多分それは十分です:あなたはそれが少しきれいにしたい場合は、高階関数の内部でそれをラップすることができます '「<属性 - 」(sapply(D、アイデンティティを)、属性(d)) ' –

+0

ありがとうございます。あなたのソリューションは完全に十分ですが、 'apply'が属性を保持するきれいなソリューションを探したいと思います。またはこれが含まれていない理由を知ってください。 –

答えて

0

sapplyには、デフォルトの引数simplify = TRUEがあり、出力をベクトル、行列、または高次元の配列に強制します。 FALSEに変更すると、

> sapply(d, function(x) x, simplify = FALSE) 
[[1]] 
[1] "2018-02-21 12:43:52 CET" 

[[2]] 
[1] "2018-02-21 12:44:52 CET" 

になります。

lapply(d, function(x) x)と同じ結果になることに注意してください。

最後にリストが必要ない場合は、Grothendieckさんのコメントが私にとって最もきれいなようです。

> m.sapply <- function(x, ...) "attributes<-"(sapply(x, ...), attributes(x)) 

> m.sapply(d, function(x) x) 
[1] "2018-02-21 12:43:52 CET" "2018-02-21 12:44:52 CET" 
関連する問題