2017-10-04 10 views
2

chronオブジェクトとsapply機能のRに問題があります。私が実行した場合、今chronとsapplyでRにバグがあります

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 

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

しかし、私は私が得るsapplyで反復的にそれを実行した場合:私はデフォルトの原点を変更し

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

だから、70年取得しますこれは私の起源(1900年)とデフォルト起源(1970年)の違いです。

バグレポートを送信するために、またはこの動作の説明と解決方法があるかどうかをお尋ねします。

ありがとうございます!

P .:私の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)'は、起源についての指示を失うことに注意してください。だから、 '年代 'は標準のPOSIX起源(1970年1月1日)を想定します。また、あなたの例では 'sprintf("%s "、years(ch))' – nicola

+0

を実際に試してみることもできます。実際には私よりやや複雑なので、 'sprintf("%s "、years(ch)) '私のために働かないだろう。私はちょうどforループを行うことでこれを解決しました –

答えて

1

ではありません。では、デフォルト以外の起源を使用することができます。できるだけ早くデフォルトの起点に変換してください。

ここでは、chと同じ日付時刻を表しますが、デフォルトの起点を示します。 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ための式に代わる次のようになります。

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

またsapplyを置き換えることができます。

format(years(ch0)) 

とsapplyなしには行っておりませんch0も必要です。

format(years(ch)) 

更新:もはや上記のコードの最初の行にエクスポートされていない(単にCRANにアップロードされた) '2.3.51' originクロンのように必要chron:::

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

アップデート2:更新された注釈があります。

+0

あなたの提案をありがとうございました。私は実際には、どのようにしてchronオブジェクトをデフォルトの起点に「変換するか」はわかりませんでした。これは役に立ちます!! –

関連する問題