2017-10-04 14 views
2

chron 개체 및 sapply 기능 인 R에 문제가 있습니다. 내가 sapply으로 반복적으로 실행하면 내가 얻을chron과 sapply가있는 R에서 가능한 버그

> sprintf("%s", years(ch[1])) 
[1] "2010" 

을 :하지만

> anios <- sapply(ch, function(x){sprintf("%s", years(x))}) 
> anios[1] 
[1] "2080" 

는 그래서 칠십년 얻을 내가 실행하면, 지금

chron_start <- chron("01/01/2010", "00:30:00",origin.=c(month=1, day=1, year=1900)) 
ch <- chron_start+(0:(365*24-1))/24 

: 나는 기본 원점 변경 이는 나의 기원 (1900)과 기본 기원 (1970)의 차이점이다.

버그 리포트를 보내거나이 동작에 대한 설명과 해결 방법이 있는지 물어보고 싶습니다.

미리 감사드립니다.

주해 : 내 R 버전은 GNU/Linux openSUSE Leap 42.2 64 비트에서 실행되는 "R 버전 3.4.2 (2017-09-28)"입니다. Chron 패키지 버전은 2.3-45

+0

Chron 2.3-50이 설치된 Windows 7의 R 3.4.1에서이 동작이 발생합니다. –

+1

'sapply' ('lapply'와 같이)는'list' 객체에 대해 동작해야합니다. 일치하지 않으면 'as.list'호출이 수행됩니다. 'as.list (ch)'는 원점에 대한 어떤 표시도 잃어 버린다. 따라서'years'는 표준 POSIX (1970 년 1 월 1 일)을 가정합니다. 또한, 당신의 예제에서'sprintf ("% s", years (ch))' – nicola

+0

을 실제로 시도해 볼 수 있습니다. 실제로 sprintf ("% s", years (ch)) '나를 위해 일하지 않을 것이다. 난 그냥 for 루프를 수행하여이 문제를 해결했습니다. –

답변

1

이 아닌은 기본이 아닌 기원을 chron과 함께 사용하거나 최대한 빨리 기본 기점으로 변환하려고합니다.

여기서 우리는 ch과 동일한 날짜 시간을 나타내지 만 기본 출처를 갖는 ch0을 만듭니다. chron 패키지에는 origin 기능 (및 origin<- 기능)이 포함되어 있지만 내보내기에는 사용되지 않으므로 chron:::으로 시작해야합니다.

ch0 <- chron(ch, origin = chron::origin(chron(0))) 

# now we get the expected years 
anios <- sapply(ch0, function(x){sprintf("%s", years(x))}) 
head(anios) 
## [1] "2010" "2010" "2010" "2010" "2010" "2010" 

참고 : ch0의 표현에 대한 대안은 위의 것 :

format(years(ch0)) 

우리가 그렇지 않은 sapply없이 :

ch0 <- ch 
chron:::origin(ch0) <- chron:::origin(chron(0)) 

는 또한 sapply로 대체 될 수있다 심지어 ch0이 필요합니다.

format(years(ch)) 

업데이트 : 더 이상 위의 코드의 첫 번째 줄 수 있도록 수출하지 (단지 크랑에 업로드) '2.3.51'origin 대하 기준으로는 필요 chron:::

ch0 <- chron(ch, origin = origin(chron(0))) 

업데이트 2 : 업데이트 된 메모를 가지고 있습니다.

+0

대단히 감사합니다. 나는 chron 객체를 기본 출처로 "변환"하는 방법을 정말로 알지 못했습니다. 이것은 도움이된다 !! –