2011-10-27 41 views
9

Có hiển thị lịch cơ bản trong R, như chương trình cal của Unix không?Hiển thị lịch cơ bản trong R

Tôi nhận ra không khó để bọc các chức năng ngày/giờ cơ sở (như weekdays, seq.date, v.v.), nhưng tôi cảm thấy mình không biết gì về điều cơ bản có thể được giải quyết trong một thời gian nổi bật/gói ngày đã tồn tại. Hơn nữa, nó luôn luôn bắt đầu chỉ đơn giản là đủ: chỉ định ngày trong tuần, nhưng sau đó một được năm nhuận, bố trí cho lịch trải dài nhiều tháng (mặc dù tôi sẽ giải quyết cho chỉ in 1 tháng), và như vậy.

Cách sử dụng hiện tại của tôi liên quan đến việc chuyển R sang Linux hoặc chương trình lịch trong Windows. Làm điều này trong R sẽ dễ dàng hơn.


Note 1. Tôi đã xem xét một số các widget khác nhau có sẵn cho Gtk2 và TclTk - đối với một số lý do, lắp đặt hệ thống hỗ trợ không hoạt động diễn ra tốt đẹp (và tôi nghĩ rằng đó là quá mức cần thiết nghiêm trọng, cũng không phải là rất tốt từ quan điểm di động để có những phụ thuộc như vậy). Trong Windows, tôi thậm chí đã thử Cygwin, để truy cập cal, nhưng cài đặt đó có vẻ mâu thuẫn với Rtools. Tóm lại, việc thêm các lớp công cụ không phải là một con đường đặc biệt hiệu quả vào lúc này. :) Tôi đã không tìm thấy bất kỳ giải pháp trong lubridate, xts, sở thú, và các gói khác, mặc dù tôi có thể đã bỏ lỡ một cái gì đó.

+0

Làm thế nào về 'hệ thống ('cal') '? – kohske

+0

@kohske - Đó là phụ thuộc vào hệ điều hành. Hoạt động trên UNIX, nhưng không phải trên Windows ... –

+0

Chính xác. Đó là lý do tại sao đây là một bình luận, không phải là một câu trả lời. – kohske

Trả lời

12

Đây là một chức năng mà sẽ làm lịch hàng năm hoặc hàng tháng cơ bản:

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 
    } 
} 

Bạn có thể chỉnh sửa phần khác nhau để tùy chỉnh nó. Bạn có thể sử dụng par(mfg=c(r,c)) để thêm văn bản, lô hoặc thông tin khác vào một ô cụ thể trong lịch hàng tháng (xem updateusrsubplot trong gói TeachingDemos để có thể hỗ trợ thêm âm mưu).

Dưới đây là một số ví dụ về cách thêm văn bản hoặc các âm mưu làm lịch:

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 Điều đó rất tuyệt. Điều đó cũng giới thiệu rất nhiều chức năng mà tôi không biết. – Iterator

+1

Có vẻ như đây là câu trả lời hay nhất tôi sẽ nhận được, nhưng tôi chỉ cần một câu trả lời. :) Tôi khuyến khích bạn đặt nó vào một gói nhỏ - nó rất hữu ích, hoặc trong gói 'TeachingDemos' của riêng bạn. Tôi ngạc nhiên rằng tôi chưa quen với cái này. Cảm ơn! – Iterator

+0

@Greg cảm ơn bạn đã đăng bài. Rất hữu dụng. –

Các vấn đề liên quan