2011-10-27 78 views
9

R中是否有基本的日曆顯示,如Unix的cal程序?我認識到它不是很難包裝基準日期/時間函數(如weekdays,seq.date等),但我覺得我對某些非常基本的東西一無所知,可能會在其中一個未完成的時間內解決/日期包已經存在。此外,它總是足夠簡單:分配一週中的幾天,然後跳躍幾年,跨越多個月的日曆佈局(雖然我只打算打印1個月),依此類推。R中的基本日曆顯示

我目前的使用情況涉及將R切換到Linux或Windows中的日曆程序。在R中這樣做會更容易。


注1:我看了一些可供Gtk2的視覺和TclTk各種小部件 - 由於某種原因,安裝配套系統不工作了好(我認爲這是嚴重的矯枉過正,也不是從可移植性的角度來看,這種依賴性非常好)。在Windows中,我甚至嘗試過使用Cygwin,以訪問cal,但該安裝似乎與Rtools衝突。簡而言之,增加層次的東西目前並不是特別有效的途徑。 :)我還沒有在lubridate,xts,zoo和其他軟件包中找到任何解決方案,儘管我可能錯過了一些東西。

+0

如何'系統( 'CAL')'? – kohske

+0

@kohske - 這是操作系統相關的。適用於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包中的updateusrsubplot以獲取可能的添加圖的幫助)。

這裏有添加文字或圖表日曆的一些例子:

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

看起來這是我會得到的最佳答案,但我只需要一個。 :)我鼓勵你把它放在一個小包裏 - 這非常有用,或者在你自己的'TeachingDemos'包中。我很驚訝,我不熟悉這一個。謝謝! – Iterator

+0

@Greg感謝發佈。很有用。 –