第五讲 R语言函数

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例子:调试larger()函数,显示两个自变量及中 间变量的值
larger<-function(x,y) { cat("x=",x,"\n") cat("y=",y,"\n") y.is.bigger<-(y>x) cat("y.is.bigger=",y.is.bigger,"\n") x[y.is.bigger]<-y[y.is.bigger] x }
例子:
f<-function(x){ y<-2*x print(x) #x为参数变量 print(y) #y为局部变量 print(z) #z为自由变量 }
例子:
cube<-function(n){ sq<-function() n*n n*sq() }
调试
R语言不具有单步跟踪、设置断点、观察表 达式等调试功能 可以用print(), cat()函数实时显示需要调试 的信息 可以用browser()函数暂停程序,并进入单 步执行状态
冒泡排序法: BubbleSort<-function(Datas,bDesc=TRUE)
调用: 啊ns<-BubbleSort(Datas) #按降序处理
函数和变量的作用范围
函数中使用的变量可以分为三种类型:参数变量、 局部变量、自由变量。 参数变量即函数的参数,调用函数时将参数的数 值传递给参数变量。 局部变量是指函数内部声明的变量,退出函数时 这些局部变量将被清除。 参数变量和局部变量以外的变量都为自由变量。 在R语言中自由变量逐级往上寻找相同名字的变 量来赋值;如果没找到则产生新的自由变量。
调用BubbleSort函数
> x<-rnorm(100,1,1) > y<-BubbleSort(x,TRUE) > plot(x) > plot(y)
练习5.1
编写一个函数,给出两个数之后,直接给 出这两个数的平方和。
定义二元操作符
在R语言中,可以将函数定义成一个操作符以方便地使用。形式为: %anything%
作业2:利用sample函数设计算法,把下面16个demo公 平地分配给15个组,并提交原程序
Base: is.things Base: recursion
Graphics: Hershey Graphics: Japanese Graphics: graphics Graphics: image Graphics: persp Graphics: plotmath Lattice: intervals Lattice: labels Lattice: lattice Lattice: panel Stats: glm.vr Stats: lm.glm Stats: nlm Stats: smooth
参数名和参数缺省定义
调用函数时,可以按照参数表的定义顺次 给参数逐一地设值,也可以通过参数名直 接应用。 采用参数名调用函数时,参数名应用的顺 序可以同函数参数定义的顺序无关。 在定义函数时可以设定一些缺省值的参数, 当调用函数时,如果不设定某个参数,则 这个参数将按缺省值进行处理。
函数: fun1<-function(data,data.frame,graph,limmit){ expression } 调用函数的形式: ans<-fun1(d,df,TRUE,20) ans<-Hale Waihona Puke Baiduun1(d,df,graph=TRUE,limit=20) ans<-fun1(data=d,limit=20,graph=TRUE,data.frame=df)
%% %*% %/% %in% %o% %x%
余数 矩阵内积 整除 交集 数组外积 Kronecker Products on Arrays
例子:交换向量中的两个数据
"%<->%"<-function(x,y) { TempData=Datas[x] Datas[x]<<-Datas[y] Datas[y]<<-TempData Datas } Datas=c(65,97,76,13,27,49,58) 2%<->%4->datas Datas [1] 65 13 76 97 27 49 58
例子:小鼠下丘听觉诱发电位在麻醉过程中的变化情况
17

要求:提取每个记录 时段对应AEP波形的 N0、P1、N1波对应 的极值和时间
read.table("D:/work/average AEP.csv",header=TRUE,sep=",")->averageAEP first.max<--10000,first.max.count<-0,second.max<--10000,second.max.count<-0, first.min<-0,first.min.count<-0 for (i in 1:17) { result<-max.Info(averageAEP[,i],60,180) #the first maxmum first.max[i]<- result[1] first.max.count[i]<-result[2] result<-max.Info(averageAEP[,i],200,600) #the second maxmum second.max[i]<- result[1] second.max.count[i]<-result[2] result<-min.Info(averageAEP[,i],150,400) #the first minmum first.min[i]<- result[1] first.min.count[i]<-result[2] browser() #跟踪信息 } latency.P1<-first.min.count/12.2 #p1 latency latency.P1.N0<-(first.min.count-first.max.count)/12.2 #n0-P1 latency latency.N1.P1<-(second.max.count-first.min.count)/12.2 #p1-N1 latency amplitude.N1.P1<-(second.max-first.min)/10 #p1-n1 amplitude AEP.character<data.frame(RecordingTime=1:17,latency.P1,latency.P1.N0,latency.N1.P1,amplitude.N1.P1)
第五讲
函数
交作业组数
14 12 10 8 6 4 2 0 1 2 3
作业次数
例子:将频率为266,333,400的内存的价格分别 增加10%,15%,12%
for (count in 1:length(MemInfo$Price)) { if (MemInfo$Frequency[count]=="266") case<-1 else if(MemInfo$Frequency[count]=="333") case<-2 else case<-3 switch(case, { MemInfo$Price[count]<-MemInfo$Price[count]*1.1 }, { MemInfo$Price[count]<-MemInfo$Price[count]*1.15 }, { MemInfo$Price[count]<-MemInfo$Price[count]*1.12 }) }
> x<-1:4 > y<-4:1 > larger(x,y) x= 1 2 3 4 y= 4 3 2 1 y.is.bigger= TRUE TRUE FALSE FALSE [1] 4 3 3 4
例子:寻找向量X在某段范围(a,b)内的最大值 和对应的下标
max.Info<-function(X,a,b,max.start=-10000){ for (j in a:b) { if (X[j]<=max.start) { max.start=X[j] max.count=j } } c(max.start,max.count) }
例子:寻找向量X在某段范围(a,b)内的最小值和 对应的下标
min.Info<-function(X,a,b,min.start=10000){ for (j in a:b) { if (X[j]<=min.start) { min.start=X[j] min.count=j } } c(min.start,min.count) }
R语言中个操作符号的优先级别
1 :: 2 $@ 3 ^ 4 -+ 5 : 6 %xyz% 7 8 9 10 11 12 13 14 15 */ +> >= < <= == != ! & && | || -> ->> = <- <<显示调用各包的共同函数 数据列表子集操作符号 求幂操作 一元操作符 序列操作符号 各种定义操作符号,包括 包括R语言系统固有的定义符号 各种定义操作符号 包括 语言系统固有的定义符号 %x%,%%,%/%,%*%,%o%,%in%等 等 二元操作符,算术运算符号 二元操作符 算术运算符号 算术运输符号 逻辑运输符号 逻辑运算符号,取反操作 逻辑运算符号 取反操作 逻辑运算符号 逻辑运算符号 移位操作符 赋值操作符 移位操作符
for (count in 1:length(MemInfo$Price)) { if (MemInfo$Frequency[count]==266) case<-1 else if(MemInfo$Frequency[count]==333) case<-2 else case<-4 switch(case, "1"={ MemInfo$Price[count]<-MemInfo$Price[count]*1.1 }, "2"={ MemInfo$Price[count]<-MemInfo$Price[count]*1.15 }, "4"={ MemInfo$Price[count]<-MemInfo$Price[count]*1.12 }) }
65,97,76,13,27,49,58 [65,76,13,27,49,58,] 97 [65,13,27,49,58,] 76,97 [13,27,49,58,] 65,76,97 [13,27,49,] 58,65,76,97 第一次扫描后的数据 第二次扫描后的数据 第三次扫描后的数据 第三次扫描后的数据
函数
作为一种对象模式,函数和操作符在R语言 内部以一种特殊的方式保存,这些函数和操 作符可以在R语言中被调用 在使用R语言的过程中我们可以调用R语言 各种包中携带的函数,也可以根据实际需要 定义自己的函数
函数的定义和调用格式
函数的定义格式 function_name<-function(arg_1,arg_2,…) { expression } 函数的调用格式 function_name(arg_1,arg_2,…)
1: 2: 3: 4:
BubbleSort<-function(Datas,bDesc) #定义冒泡法排序函数bubbleSort() { if (!is.atomic(Datas)) { stop("'Datas' must be atomic'") } i=length(Datas)-1 while (i>0) { nLastExchangeIndex=0 j=0 for (j in 1:i) { if ((bDesc && Datas[j]>Datas[j+1])||(!bDesc && Datas[j]<Datas[j+1])) { TempData=Datas[j] Datas[j]=Datas[j+1] Datas[j+1]=TempData nLastExchangeIndex=j } } i=nLastExchangeIndex } Datas }B
例子
xor <- function(x, y) { (x | y) & !(x & y) }
> x<-c(T,T,F,F) > y<-c(T,F,T,F) > xor(x,y) [1] FALSE TRUE TRUE FALSE
异或:相异返回TRUE,相同返回FALSE.
例子:冒泡法排序
冒泡法排序算法:从第i个元素开始两两进行 比较,并将较大的数值往后推移
相关文档
最新文档