2011-10-27 4 views
9

UnixのcalプログラムのようなRの基本的なカレンダー表示はありますか?Rの基本的なカレンダー表示R

基本日付/時刻関数(weekdaysseq.dateなど)をラップするのは難しいことではないことに気付きましたが、未だに未解決の問題/すでに存在する日付パッケージ。さらに、それは常に簡単に始まります。曜日を割り当てますが、その後は1ヵ月の閏年になります(複数の月にまたがるカレンダーのレイアウト(1ヵ月だけ印刷するだけです)。

私の現在の使用方法は、RからLinuxへの切り替え、またはWindowsのカレンダープログラムです。これをRで行う方が簡単です。


注1.私はGtk2のとTclTkために利用可能なさまざまなウィジェットのいくつかを見てきました - いくつかの理由で、システムをサポートするのインストールがうまく機能していない(と私はそれが深刻なやり過ぎだと思う、またそれは、そのような依存関係を持つために移植性の観点から非常に良い)。 Windowsでは、私はcalにアクセスするためにCygwinを試しましたが、そのインストールはRtoolsと競合しているようです。要するに、層を追加することは、今のところ特に生産的な方法ではありません。 :)私は何かを見逃しているかもしれませんが、私はlubridate、xts、動物園、および他のパッケージでは解決策を見つけられませんでした。ここで

+0

どのようにシステム 'については、'( 'CAL')? – kohske

+0

@kohske - それはOSに依存します。 UNIXでは動作しますが、Windowsでは動作しません。 –

+0

正確に。これがコメントであり、答えではありません。 – kohske

答えて

12

は、基本的な年間または月間カレンダーを行います関数です。

cal <- function(month, year) { 

     if(!require(chron)) stop('Unable to load chron package') 

    if(missing(year) && missing(month)) { 
     tmp <- month.day.year(Sys.Date()) 
     year <- tmp$year 
     month <- tmp$month 
    } 


    if(missing(year) || missing(month)){ # year calendar 
     if(missing(year)) year <- month 
     par(mfrow=c(4,3)) 
     tmp <- seq.dates(from=julian(1,1,year), to=julian(12,31,year)) 
     tmp2 <- month.day.year(tmp) 
     wd <- do.call(day.of.week, tmp2) 
     par(mar=c(1.5,1.5,2.5,1.5)) 
     for(i in 1:12){ 
      w <- tmp2$month == i 
      cs <- cumsum(wd[w]==0) 
      if(cs[1] > 0) cs <- cs - 1 
      nr <- max(cs) + 1 
      plot.new() 
      plot.window(xlim=c(0,6), ylim=c(0,nr+1)) 
      text(wd[w], nr - cs -0.5 , tmp2$day[w]) 
      title(main=month.name[i]) 
      text(0:6, nr+0.5, c('S','M','T','W','T','F','S')) 
     } 

    } else { # month calendar 

     ld <- seq.dates(from=julian(month,1,year), length=2, by='months')[2]-1 
     days <- seq.dates(from=julian(month,1,year), to=ld) 
     tmp <- month.day.year(days) 
     wd <- do.call(day.of.week, tmp) 
     cs <- cumsum(wd == 0) 
     if(cs[1] > 0) cs <- cs - 1 
     nr <- max(cs) + 1 
     par(oma=c(0.1,0.1,4.6,0.1)) 
     par(mfrow=c(nr,7)) 
     par(mar=c(0,0,0,0)) 
     for(i in seq_len(wd[1])){ 
      plot.new() 
      #box() 
     } 
     day.name <- c('Sun','Mon','Tues','Wed','Thur','Fri','Sat') 
     for(i in tmp$day){ 
      plot.new() 
      box() 
      text(0,1, i, adj=c(0,1)) 
      if(i < 8) mtext(day.name[wd[i]+1], line=0.5, 
       at=grconvertX(0.5,to='ndc'), outer=TRUE) 
     } 
     mtext(month.name[month], line=2.5, at=0.5, cex=1.75, outer=TRUE) 
     #box('inner') #optional 
    } 
} 

あなたはそれをカスタマイズするための様々な部分を編集することができます。 par(mfg=c(r,c))を使用して、月単位のカレンダーのセルにテキスト、プロット、その他の情報を追加することができます(プロットの追加については、TeachingDemosパッケージのupdateusrおよびsubplotを参照してください)。

ここカレンダーにテキストやプロットを追加するいくつかの例です:

cal(10,2011) 
par(mfg=c(3,2)) # monday oct 10 
text(.5,.5, 'Some\nText', cex=2) 

par(mfg=c(2,3)) #Tues oct 4 
text(1,1, 'Top Right', adj=c(1,1)) 

par(mfg=c(2,4)) # Wed oct 5 
text(0,0, 'Bottom Left', adj=c(0,0)) 

par(mfg=c(6,2)) # oct 31 
tmp.x <- runif(25) 
tmp.y <- rnorm(25,tmp.x,.1) 
par(usr=c(range(tmp.x), range(tmp.y))) 
points(tmp.x,tmp.y) 
+0

+1それはとても涼しいです。それはまた私が気づいていない多くの機能を紹介します。 – Iterator

+1

これは私が得る最高の答えですが、私は1つだけ必要です。私はあなたを少しのパッケージに入れておくことをお勧めします。これは非常に便利です。またはあなた自身の 'TeachingDemos'パッケージに入れてください。私はこれに慣れていないことに驚いています。ありがとう! – Iterator

+0

@Gregが投稿してくれてありがとうございます。非常に便利。 –

関連する問題