2017-11-15 1 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"