use R for fun系列之小应用建造篇
系列以use R for fun为主题,以COS论坛上的英华帖、相关的package以及本身的一些code为素材,团结自身的一些编程体会,从而整合成文。本文是第二篇小应用建造篇。
*本文素材出处均已在正文注明
本文继承承接上一篇的话题(小游戏开拓篇),继承在交互操纵上做文章,差异的是这里引入了更富厚的操纵和idea,仅仅做些小游戏还远远达不到我们的胃口,因此这里不妨再把思维拓宽些,让R来我们的糊口处事(理论上),于是小应用建造篇就此降生,虽称不上游戏但同样可以给我们带来的快乐。由于面更广因此idea就更为要害了(在玩统计的进程中idea同样要害!),上篇所讲的内容可以被完美担任到本篇中,至于其他内容很难懂晰说需要事先把握R的某一块内容(少量增加了一些),所以这里就直接上例子!
一、关机
听起来好像挺不错的,当你把代码码完想关电脑时,是不是以为关个电脑都以为贫苦,没错R可以帮你自动关机。提前加载fun包,想关机的时候
shutdown()
然后回车你就可以安心的去睡觉了(虽然直接用shell(()可能system()装逼么也完全可以),另外函数的wait参数,可以用于配置期待时间,也就是几多时间后再行关机(以秒为单元),因此还可以用来配置按时关机(例如说写在措施最后,假如措施需要跑一晚上的话)。COS原帖在这里,源代码在这里,最后加一句:危险行动,审慎仿照!
二、新年快乐
曾经也想过做一些雷同用于新年祝福的对象,怎奈每次新年不是这事就是那事,比及真的有空了,一看早被人抢了先了(并且新年早过了),那也没有步伐,继承引用呗!COS前辈们创作的关于新年快乐的something大部门已经收录在fun包的demo中,有空的时候可以一一demo之,内里有音乐也有动画,思量到关于音乐和动画的文章排在后头,所以这里先不细说,可是可以先跑为快!不妨试一试
demo(HappyNewYear2010Yixuan)
就能看到炫酷的动画再来看看happy new year的转动字幕,本来demo中并没有把坐标去掉,若想要更好的结果,可以先
par(bty=”n”,xaxt=”n”, yaxt=”n”,mar=c(0,0,0,0));
把坐标去掉,同时拓宽作图面积(再多嘴一句,要想画出本身满足的图,par必然要把握好,虽然ggplot粉请忽略),虽然同时也可以本身再加一个喜庆一点的配景什么的,截取某一个瞬间另外
demo(HappyNewYear2009Music);
就可以听到纯正的新年快乐歌了(这里需要加载tuneR包可能sound包,关于音乐建造方面敬请等候之后的文章)。关于COS原帖临时没有考据,读者可以自行进论坛搜索之。
三、放大镜
放大镜的idea来历于谢大在它的《现代统计图形》中给的一个例子,可是感受这幅图实在说不出什么现实一点的描写,于是灵机一动对主体部门稍作修缮,就改革成了一个较量挫的放大镜。因此只是在某一幅特定的图中具有放大结果,所以也不能算纯粹的放大镜,不外娱乐结果好歹是有了那么一点。主要是对mousemove这一块的窜改,改成下面的code
mousemove<-function(buttons, x, y) {r<-0.2;idx=(xx-x)^2+(yy-y)^2<r^2plot(xx, yy, type=”n”)rect(-1, -1, 2, 2, col=”gray”)points(xx[idx], yy[idx], col=”green”, cex = 2)points(xx[!idx], yy[!idx], col=”green”)t<-seq(0,2*pi,0.01);lines(r*sin(t)+x,r*cos(t)+y,col=”blue”,lwd=5);lines(1.1*r*sin(t)+x,1.1*r*cos(t)+y,col=”blue”,lwd=5);}
然后随机点的配置的多一点(改成200个点或者结果更好点),就有种放大镜(显微镜)下看细菌(点的形状可变,譬喻酿成杆菌之类的)的感受了!虽然其实也有许多可以进一步改造的处所,譬喻对某几个点非凡处理惩罚一下,就可以改成照妖镜了。虽然也可以再往镜子上加根棍子之类的,不怕做不到就怕想不到!
四、计较器——DIY
前面的示例大多较量随意,于是这里挑一个写这篇文章时姑且起兴而写的措施作为详解的示例——计较器,建造计较器可以通过两种途径,一种是建造GUI,结果会较量装逼,假如做得仔细的话完全可以做得跟微软自带的计较器一模一样甚至完爆它,可是这会用到tcltk可能GTK+之类的,不切合本文一切从简的原则,不外这里照旧多嘴提一句假如对做GUI感乐趣的话可以回收gWidgets系列的几个package,关于这方面的内容没记错的话谢大曾经在某界China-R上做个一个陈诉,另外还可以参考其自带的小品文,绝不浮夸的说用它来山寨个统计软件界面那是不再话下。回到主题,第二种就是依然借助于R强大的作图设备,再次操作给力的交互式作图来完成,事实也说明,把握的不在多而在于精,假如可以或许对几个重要的函数有着深刻的领略而且可以或许机动的运用胜过只是传闻一堆函数却不去实际操纵。
计较器的建造分为三步,一是计较机界面,关于界面参考最老式的就行了,输出框+数字键+运算符,ok搞定,用一下segments和text足矣,虽然为了不瞎了别人的眼,配色什么的也需要调一下,思量到笔者审雅观很是拙计,已遭n多人吐槽,故无奈只得通过随机数的要领举办配色,还请宽大读者体谅。第二步是键盘与图形的交互,这里与图片中的按键无关,但需要拟定键盘上某些需要的按键的详细成果,而重点又在于运算符,这里为了能和后头的鼠标团结操纵,需要用到全局赋值,\verb”<<-“,也就是第三步就是鼠标和数字键的对应啦,这一步并不繁琐因为详细的操纵都可以直接copy第二步的代码,唯独需要窜改的就是把坐标信息和图中的数字键对应起来。
这里只是开拓了部门最根基的四则运算成果,剩下的就留给各人发挥本身的想象来填补这些空白了,详细的要领完全可以依葫芦画瓢,但更倡导另辟门路开辟创新。
注:代码(即行而作,不堪入目,目测可以精简)附在本文最后。
五、闹钟
之前可以说是一个半制品,那么最后给一个制品——闹钟来收官,这其实是闹钟兼时钟,最初想法的来历是某处programming的时候用到了系统时间的获取,于是想到了把他可视化(委曲称之为可视化吧,列位看官给我留点体面)出来, 闹钟其实本质上是一个动画,个中融合了简朴音乐的建造。之前我把只完成了一部门的代码传在了人大经济论坛上(bug较量多,忽略为好),后颠末尾修缮,大抵做出了点样子,详细的进程我就不说了,关于最终的代码利便起见我做成了一个小的package,可以在我的blog上下载。六、关于一些用到函数的表明
示例顶用到了一些或者做普通statistical computation时不太常用的函数,这里有须要简朴表明一下它们的用法仅供参考。
(1)winDialog():该函数的成果怕是看了名字就能猜到一二了,它可以在windows系统下弹出一个对话框,也可以算是一种交互吧,在需要配置一些提示手段之类的环境下该函数具有不错的结果,譬喻在闹钟就是在时间到了的时候弹出了时间到的窗口。该函数的usage的如下:
winDialog(type = c(“ok”, “okcancel”, “yesno”, “yesnocancel”),message)
tag共有两个,type指的是窗口的范例。假如选择的是”ok”则弹出的窗口中会有”确定”按钮,同理”okcancel”则是”确定”和”打消”,”yes”和”no”为”是”和”否”,而message则是弹出的窗口需要表达的信息,譬喻”Hello World”。winDialog函数的结果可以参考下图:
别的与winDialog有关的尚有一个很是有意思的函数,就是winMenus系列function,它可以用来修改windows窗口菜单,详细可以参考?winMenus
(2)Sys.sleep():这个函数其实还挺常用的,同样可以顾名思义,其用途就是让措施暂停运行一段时间,因为的参数就是时间,以秒为单元。
这篇可以看做是小游戏篇的续集,假如有更好的示例可能idea接待和我可能COS的几位前辈接洽,会实时更新,虽然假如很棒的话目测就坚决收录fun包了。关于基于交互式操纵部门就先行告一段落,虽然之后必定还会提及,下篇预告——让你的R酿成免费ps篇。
附录:
1、计较器代码:
par(bty=”n”,xaxt=”n”, yaxt=”n”,mar=c(0,0,0,0),cex=5,font=4);plot(c(0,1),c(0,1),type=”n”,xlab=””,ylab=””);color1<-rainbow(1000)[sample(1:1000,1)];color2<-rainbow(1000)[sample(1:1000,1)];color3<-rainbow(1000)[sample(1:1000,1)];color4<-rainbow(1000)[sample(1:1000,1)];color5<-rainbow(1000)[sample(1:1000,1)];segments(0.1, 0.1, 0.1, 0.85, col=color1, lwd =4);segments(0.25, 0.1, 0.25, 0.7, col=color1, lwd =4);segments(0.4, 0.1, 0.4, 0.7, col=color1, lwd =4);segments(0.55, 0.1, 0.55, 0.7, col=color1, lwd =4);segments(0.7, 0.1, 0.7, 0.85, col=color1, lwd =4);segments(0.85, 0.1, 0.85, 0.85, col=color1, lwd =4);segments(0.1, 0.1, 0.85, 0.1, col=color1, lwd =4);segments(0.1, 0.25, 0.7, 0.25, col=color1, lwd =4);segments(0.1, 0.4, 0.85, 0.4, col=color1, lwd =4);segments(0.1, 0.55, 0.85, 0.55, col=color1, lwd =4);segments(0.1, 0.7, 0.85, 0.7, col=color1, lwd =4);segments(0.1, 0.85, 0.85, 0.85, col=color1, lwd =4);#marginrect(0.08,0.08,0.87,0.87,border=color1, lwd =4);#digittext(0.5,0.95,”Calculator”,font=2,col=color5,cex=0.6);par(bty=”n”,xaxt=”n”, yaxt=”n”,mar=c(0,0,0,0),cex=5,font=4);plot(c(0,1),c(0,1),type=”n”,xlab=””,ylab=””);color1<-rainbow(1000)[sample(1:1000,1)];color2<-rainbow(1000)[sample(1:1000,1)];color3<-rainbow(1000)[sample(1:1000,1)];color4<-rainbow(1000)[sample(1:1000,1)];color5<-rainbow(1000)[sample(1:1000,1)];segments(0.1, 0.1, 0.1, 0.85, col=color1, lwd =4);segments(0.25, 0.1, 0.25, 0.7, col=color1, lwd =4);segments(0.4, 0.1, 0.4, 0.7, col=color1, lwd =4);segments(0.55, 0.1, 0.55, 0.7, col=color1, lwd =4);segments(0.7, 0.1, 0.7, 0.85, col=color1, lwd =4);segments(0.85, 0.1, 0.85, 0.85, col=color1, lwd =4);segments(0.1, 0.1, 0.85, 0.1, col=color1, lwd =4);segments(0.1, 0.25, 0.7, 0.25, col=color1, lwd =4);segments(0.1, 0.4, 0.85, 0.4, col=color1, lwd =4);segments(0.1, 0.55, 0.85, 0.55, col=color1, lwd =4);segments(0.1, 0.7, 0.85, 0.7, col=color1, lwd =4);segments(0.1, 0.85, 0.85, 0.85, col=color1, lwd =4);#marginrect(0.08,0.08,0.87,0.87,border=color1, lwd =4);#digittext(0.5,0.95,”Calculator”,font=2,col=color5,cex=0.6);text(0.5,0,”Made by Chen-ang Liu”,font=2,col=color5,cex=0.2);text(0.17,0.18,”1″,font=2,col=color2);text(0.32,0.18,”2″,font=2,col=color2);text(0.47,0.18,”3″,font=2,col=color2);text(0.17,0.33,”4″,font=2,col=color2);text(0.32,0.33,”5″,font=2,col=color2);text(0.47,0.33,”6″,font=2,col=color2);text(0.17,0.48,”7″,font=2,col=color2);text(0.32,0.48,”8″,font=2,col=color2);text(0.47,0.48,”9″,font=2,col=color2);text(0.17,0.63,”+”,font=2,col=color3);text(0.32,0.63,”-“,font=2,col=color3);text(0.47,0.63,”*”,font=2,col=color3);text(0.62,0.63,”/”,font=2,col=color3);text(0.62,0.48,”=”,font=2,col=color3);N<-c(0,0);add<-0;subtract<-0;multiply<-0;divide<-0;keybd<-function(key){if(key==”1″){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,1);text(0.62,0.78,”1″,font=2,col=color4);}else if(key==”2″){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,2);text(0.62,0.78,”2″,font=2,col=color4);}else if(key==”3″){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,3);text(0.62,0.78,”3″,font=2,col=color4);}else if(key==”4″){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,4);text(0.62,0.78,”4″,font=2,col=color4);}else if(key==”5″){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,5);text(0.62,0.78,”5″,font=2,col=color4);}else if(key==”6″){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,6);text(0.62,0.78,”6″,font=2,col=color4);}else if(key==”7″){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,7);text(0.62,0.78,”7″,font=2,col=color4);}else if(key==”8″){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,8);text(0.62,0.78,”8″,font=2,col=color4);}else if(key==”9″){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,9);text(0.62,0.78,”9″,font=2,col=color4);}else if(key==”Left”){add<<-1;subtract<<-0;multiply<<-0;divide<<-0;text(0.17,0.63,”+”,font=2,col=color3);}else if(key==”Up”){add<<-0;subtract<<-1;multiply<<-0;divide<<-0;text(0.32,0.63,”-“,font=2,col=color3);}else if(key==”Right”){add<<-0;subtract<<-0;multiply<<-1;divide<<-0;text(0.47,0.63,”*”,font=2,col=color3);}else if(key==”Down”){add<<-0;subtract<<-0;multiply<<-0;divide<<-1;text(0.62,0.63,”/”,font=2,col=color3);}else if(key==”e”){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);a<<-N[(length(N)-1)];b<<-N[length(N)];if(add==1){cons<<-a+b;}else if(subtract==1){cons<<-a-b;}else if(multiply==1){cons<<-a*b;}else if(divide==1){if(b==0){cos<<-0;}else{cons<<-a/b;}}text(0.4,0.78,cons,font=2,col=color4);}}mousedown<-function(button,x,y){if(x>0.1&&x<0.25&&y>0.1&&y<0.25){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,1);text(0.62,0.78,”1″,font=2,col=color4);}else if(x>0.25&&x<0.4&&y>0.1&&y<0.25){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,2);text(0.62,0.78,”2″,font=2,col=color4);}else if(x>0.4&&x<0.55&&y>0.1&&y<0.25){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,3);text(0.62,0.78,”3″,font=2,col=color4);}else if(x>0.1&&x<0.25&&y>0.25&&y<0.4){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,4);text(0.62,0.78,”4″,font=2,col=color4);}else if(x>0.25&&x<0.4&&y>0.25&&y<0.4){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,5);text(0.62,0.78,”5″,font=2,col=color4);}else if(x>0.4&&x<0.55&&y>0.25&&y<0.4){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,6);text(0.62,0.78,”6″,font=2,col=color4);}else if(x>0.1&&x<0.25&&y>0.4&&y<0.55){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,7);text(0.62,0.78,”7″,font=2,col=color4);}else if(x>0.25&&x<0.4&&y>0.4&&y<0.55){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,8);text(0.62,0.78,”8″,font=2,col=color4);}else if(x>0.4&&x<0.55&&y>0.4&&y<0.55){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);N<<-c(N,9);text(0.62,0.78,”9″,font=2,col=color4);}else if(x>0.1&&x<0.25&&y>0.55&&y<0.7){add<<-1;subtract<<-0;multiply<<-0;divide<<-0;text(0.17,0.63,”+”,font=2,col=color3);}else if(x>0.25&&x<0.4&&y>0.55&&y<0.7){add<<-0;subtract<<-1;multiply<<-0;divide<<-0;text(0.32,0.63,”-“,font=2,col=color3);}else if(x>0.4&&x<0.55&&y>0.55&&y<0.7){add<<-1;subtract<<-0;multiply<<-1;divide<<-0;text(0.47,0.63,”*”,font=2,col=color3);}else if(x>0.55&&x<0.7&&y>0.55&&y<0.7){add<<-0;subtract<<-0;multiply<<-0;divide<<-1;text(0.62,0.63,”/”,font=2,col=color3);}else if(x>0.55&&x<0.7&&y>0.4&&y<0.55){rect(0.12,0.71,0.69,0.84,col=”white”,border=NA);a<<-N[(length(N)-1)];b<<-N[length(N)];if(add==1){cons<<-a+b;}else if(subtract==1){cons<<-a-b;}else if(multiply==1){cons<<-a*b;}else if(divide==1){if(b==0){cos<<-0;}else{cons<<-a/b;}}cons<<-round(cons,2)text(0.4,0.78,cons,font=2,col=color4);}
}getGraphicsEvent(“run!”,onKeybd=keybd,onMouseDown=mousedown)
2、clock包下载
下载:Clock