第四讲-程序设计.ppt

上传人:s****8 文档编号:67137703 上传时间:2022-12-23 格式:PPT 页数:26 大小:402.50KB
返回 下载 相关 举报
第四讲-程序设计.ppt_第1页
第1页 / 共26页
第四讲-程序设计.ppt_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《第四讲-程序设计.ppt》由会员分享,可在线阅读,更多相关《第四讲-程序设计.ppt(26页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、例如,如果变量lambda为缺失值就给它赋一个缺省值,可用:if(is.na(lambda)lambda if (all(x0)&all(log(x)0)y if(x0)1 else 0当x是标量时这个定义是有效的,但是当自变量x是一个向量时,比较的结果也是一个向量,这时条件无法使用。所以,这个分段函数应该这样编程:y=numeric(length(x)yx0 yx=0 ifelse(condition,a,b)它表示,当conditioni成立的时候,对应的取值为ai,否则取值为bi。最终返回一个和参数向量同长的向量 x a-pass;b ifelse(x=60,a,b)1 fail pas

2、s pass pass a b ifelse(x=60,a,b)1 b1 a2 a3 a4若a,b和x不是等长的,则较短的循环使用switch语句语句switch是多分支语句,其用法为:switch(statement,list);statement是一个表达式,list是列表,也可以用有名定义。根据表达式与list的关系返回一个值。如果表达式返回值属于1:length(list)中的一个,则返回list中相应位置的值,否则返回NULL。a a x a a x a x a sum-0;for(i in 1:100)sum-sum+i;i x=numeric(365)for(i in 1:365

3、)xi=1 for(j in 0:(i-1)xi=xi*(365-j)/365 xi x for(n in 1:365)xn=1-prod(365:(365-n+1)/365)这段程序只用了1秒。注意不能直接去计算365!,这会超出数值表示范围。我们有时候需要在某个判定条件成立的时候开始循环,一旦条件不成立,就终止循环,这时可以用while循环语句。while循环是在开始处判断循环条件的,用法为:while (condition)expression 表示在condition成立的时候,执行expression。例:一段二分法解方程的程序。eps if(f(a)*f(b)eps)c-(a+b)

4、/2;if (f(a)*f(c)0)b-c else a-c root f-1;f2-1;i while(fi+fi+11000)fi+2-fi+fi+1 i f 1 1 1 2 3 5 8 13 21 34 55 89 144 13 233 377 610 987例(续):用repeat语句生成1000以内Fibonacci数列 f-1;f2-1;i repeat fi+2-fi+fi+1;i=1000)break;f 1 1 1 2 3 5 8 13 21 34 55 89 144 13 233 377 610 987编写自己的函数编写自己的函数R允许用户创建自己的函数。事实上,R本身提供

5、的绝大多数函数如sum(),plot()等,是编写人员写在R中的,与用户自己创建的函数没有本质上的区别。R中函数定义的一般格式为 function.name hello=function()cat(Hello,worldn);hello#查看函数具体内容 function()cat(Hello,worldn);hello()#运行函数 Hello,world 函数体为一个复合表达式,各表达式的之间用换行或分号分开。不带括号调用函数显示函数定义,而不是调用函数。在命令行输入函数程序很不方便修改,所以我们一般是打开一个其他的编辑程序(如Windows 的记事本),输入以上函数定义,保存文件,比如保

6、存到了C:Rhello.R,我们就可以用 source(“Hi.R)运行文件中的程序。实际上,用source()运行的程序不限于函数定义,任何R程序都可以用这种方式编好再运行,效果与在命令行直接输入是一样的。对于一个已有定义的函数,可以用fix()函数来修改,如:fix(hello)将打开一个编辑窗口显示函数的定义,修改后关闭窗口函数就被修改了。fix()调用的编辑程序缺省为记事本,可以用“options(editor=编辑程序名)”来指定自己喜欢的编辑程序。函数可以带参数,可以返回值,例如:larger-function(x,y)y.is.bigger x);xy.is.bigger tra

7、ns=function(x,scale)if(!missing(scale)x=scale*x 此函数当给了scale的值时对自变量x乘以此值,否则保持原值。这种用法在其它语言中是极其少见的,R可以实现这一点是因为R的函数调用在用到参数的值时才去计算这个参数的值(称为“懒惰求值”),所以可以在调用时缺少某些参数而不被拒绝。R函数还可以有一个特殊的“.”虚参,表示所有不能匹配的实参,调用时如果有需要与其它虚参结合的实参必须用“虚参名”的格式引入。例如:fmin fmin(c(5,1,2),c(9,4,7)1 1 4 函数体内的变量也是局部的,对函数体内的变量赋值当函数结束运行后变量值就删除了,不

8、影响原来同名变量的值。例如:x f f()1 2 x 1 2 这个例子中原来有一个变量x值为2,函数中为变量x赋值20,但函数运行完后原来的x值并未变化。但是也要注意,函数中的显示函数调用时局部变量x还没有赋值,显示的是全局变量x 的值。这是这是R编程比较编程比较容易出问题的地方:你用到了一个局部变量的值,你容易出问题的地方:你用到了一个局部变量的值,你没有意识到这个局部变量还没有赋值,而程序却没有没有意识到这个局部变量还没有赋值,而程序却没有出错,因为这个变量已有全局定义。出错,因为这个变量已有全局定义。1 A Ai b cl cl.f fit1 g1 marks ns 10 p1 rec

9、tmp.x x x1 x2 x3 y rm(x,x1,x2,x3)ls()1 A Ai b cl cl.f fit1 g1 marks ns 10 p1 rec tmp.x y ls()可以指定一个pattern参数,此参数定义一个匹配模式,只返回符合模式的对象名。模式格式是UNIX中grep的格式。比如,ls(pattern=tmp.)可以返回所有以“tmp.”开头的对象名。rm()可以指定一个名为list的参数给出要删除的对象名,所以rm(list=ls(pattern=“tmp.”)可以删除所有以“tmp.”开头的对象名。rm(list=ls()删除所有对象。n=1:10;x=sin(n

10、*pi/10);cat(x=,x)1 x=0.309017 0.5877853 0.809017 0.9510565 1 0.9510565 0.809017 0.5877853 0.309017 1.224606e-16 fsin-function(x)sin-0;for(i in 1:length(x)sini-sin(xi*pi/10);return(sin);y-1:10;fsin(y);1 3.090170e-01 5.877853e-01 8.090170e-01 9.510565e-01 1.000000e+00 6 9.510565e-01 8.090170e-01 5.877

11、853e-01 3.090170e-01 1.224606e-16 例例 对对n=1,2,10,求求xn=的值的值Money.Rmoney=10000years=0while(money source(Money.R);years;money;1 281 20074.31 fun1=xx12+1;yx=1=2*xx fun(c(1,2,3)1 fun=2 5 10例例 total client client$deposit(20);client$withdraw(200);client$withdraw(40);client$balance();例例 编写一个一元二次方程的求根公式编写一个一元

12、二次方程的求根公式求根公式root()root-function(a,b,c)delta-b2-4*a*c if(delta 0)stop(Sorry,this equation has no solution!n)else if(delta=0)root 0)root1-(-b+sqrt(delta)/2*a;root2-(-b-sqrt(delta)/2*a;cat(root1 is,root1,n,root2 is,root2,n);例例 score.txt(tab分隔的文本文档)文档存放了某次选秀节目10位选手的姓名和6个评委的打分记录,根据比赛规则,对每位选手的最终成绩计算方法为:去

13、掉一个最高分,去掉一个最低分,然后剩下的求平均。请编写一个程序,将每位选手的最终成绩存放在result中,要求result的结果里面的第一列是选手的姓名,第二列是他的最终成绩,第三列是名次。score-read.table(score.txt,header=T,sep=t);score;final.score-numeric(length=nrow(score);for(i in 1:length(final.score)high.score-which(scorei,2:ncol(score)=max(scorei,2:ncol(score);#返回最高分所在的位置 low.score-wh

14、ich(scorei,2:ncol(score)=min(scorei,2:ncol(score);#返回最低分所在位置 temp-scorei,c(-(high.score1+1),-(low.score1+1);#注意后面+1的作用 temp-as.numeric(temp2:ncol(temp);#temp是list结构,强制转换成数值型向量求均值 final.score i-mean(temp);order-order(final.score,decreasing=T);result-data.frame(Name=scoreorder,1,Final.score=final.scor

15、eorder,Order=1:nrow(score);例例 计算定积分 采用复化梯形公式:每次将区间二等分,在子区间上采用梯形求面积公式,如果计算满足精度要求或达到最大迭代次数,则停止计算,否则继续将区间对分。integration-function(f,a,b,eps=1.0e-06,it_max=10)#以下嵌套一个子程序 fun1 fun1-function(f,a,b,fa,fb,s0,eps,it_max,fun)mid-(a+b)/2;h-(b-a)/4;fd-f(mid);#构造中点和梯形的高 s1-(fa+fd)*h;s2-(fb+fd)*h;if(abs(s0-s1-s2)e

16、ps|it_max=0)return(s1+s2)else#若精度不够,继续迭代 return(fun1(f,a,mid,fa,fd,s1,eps,it_max-1,fun)+fun1(f,b,mid,fa,fd,s2,eps,it_max-1,fun)fa-f(a);fb-f(b);s0-(fa+fb)*(b-a)/2;fun1(f,a,b,fa,fb,s0,eps,it_max,fun1);f A=matrix(floor(rnorm(100,0,4),4,25)(2)有一函数 ,写一程序,输入自变量的值,输出函数值.不超过X的最大整数(3)有缺失数据矩阵的插补。对缺失矩阵每一列的缺失值用该列所有观测到数据的平均值代替,得到新的无缺失值矩阵。要求同(1),例如 A=matrix(floor(rnorm(100,0,4),4,25)A2,5=NA;A4,8=NA;A3,15=NA

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com