R软件及统计分析因子列表数据框程序设计结构课件

上传人:文**** 文档编号:242697409 上传时间:2024-09-01 格式:PPT 页数:77 大小:344.97KB
返回 下载 相关 举报
R软件及统计分析因子列表数据框程序设计结构课件_第1页
第1页 / 共77页
R软件及统计分析因子列表数据框程序设计结构课件_第2页
第2页 / 共77页
R软件及统计分析因子列表数据框程序设计结构课件_第3页
第3页 / 共77页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,实验目的,实验内容,学习,S,语言中,离散变量、混合数据,的表示方法,1,、数据表示方法,2,、应用实例,3,、实验作业,因子、列表、数据框,实验目的实验内容学习S语言中离散变量、混合数据的表示方法1、,因子和有序因子,统计中的变量重要类别:,区间变量和名义变量、有序变量。,区间变量取连续的数值,可以进行求和、平均等运算。,名义变量和有序变量取离散值,既可用数值代表也可用字符型值,其具体数值没有数量意义,不能用于加减乘除计算而只能用来分类或者计数。名义变量比如性别、省份、职业,有序变量比如班级名次。,因为离散变量有各种不同表示方法,在,S,中为统一起见使用因子,(factor),来表示这种分类变量。还提供了有序因子,(ordered factor),来表示有序变量。,因子和有序因子 统计中的变量重要类别:,因子是一种特殊的字符型向量,其中每一个元素取一组离散值中的一个,而因子对象有一个特殊属性,levels,表示这组离散值(用字符串表示)。例如:, x y y,1,男 女 男 男 女,Levels:,男 女,函数,factor(),用来把一个向量编码成为一个因子。,一般形式为:,factor(x, levels = sort(unique(x), na.last = TRUE), labels, exclude = NA, ordered = FALSE),因子是一种特殊的字符型向量,其中每一个元素取一组离散值中的一,可以自行指定各离散取值(水平,levels,),不指定时由,x,的不同值来求得。,labels,可以用来指定各水平的标签,不指定时用各离散取值的对应字符串。,exclude,参数用来指定要转换为缺失值(,NA,)的元素值集合。如果指定了,levels,,则因子的第,i,个元素当它等于水平中第,j,个时元素值取“,j”,,如果它的值没有出现在,levels,中则对应因子元素值取,NA,。,ordered,取真值时表示因子水平是有次序的(按编码次序)。,可以用,is.factor(),检验对象是否因子,用,as.factor(),把一个向量转换成一个因子。,可以自行指定各离散取值(水平levels),不指定时由x的不, x=c(1,0,1,1,0),y=factor(x,levels=sort(unique(x),decreasing=T),labels=c(,男, ,女,),exclude=NA,order=F), y,1,男 女 男 男 女,Levels:,男 女, x=c(1,0,1,1,0,2),y=factor(x,levels=c(1,0),labels=c(,男, ,女,),exclude=NA,order=F), y,1,男 女 男 男 女,Levels:,男 女, x=c(1,0,1,1,0) x=c(1,0,1,1,因子的基本统计是频数统计,用函数,table(),来计数。例如,, sex = factor(c(,男, ,女, ,男, ,男, ,女,), res.tab res.tab,男 女,3 2,表示男性,3,人,女性,2,人。,table(),的结果是一个带元素名的向量,元素名为因子水平,元素值为该水平的出现频数。,S,的结果除了可以显示外,本身都是,S,对象(如这里的向量结果),可以很方便地进一步处理。,可以用两个或多个因子进行交叉分类。比如,性别(,sex,)和职业(,job,)交叉分组可以用,table(sex, job),来统计每一交叉类的频数,结果为一个矩阵,矩阵带有行名和列名,分别为两个因子的各水平名。,因子的基本统计是频数统计,用函数table()来计数。例如,,因子可以用来作为另外的同长度变量的分类变量。比如,假设上面的,sex,是,5,个学生的性别,而, h tapply(h, sex, mean),可以求按性别分类的身高平均值。,这样用一个等长的因子向量对一个数值向量分组的办法叫做不规则数组(,ragged array,)。后面我们还可以看到更多的因子的应用。,因子可以用来作为另外的同长度变量的分类变量。比如,假设上面的,实验目的,学习,S,语言中数据,列表,列表(,list,),实验目的学习S语言中数据列表列表(list),列表定义,列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可以是任意对象,不同元素不必是同一类型。元素本身允许是其它复杂数据类型,比如,列表的一个元素也允许是列表。,列表元素用“列表名,下标,”,的格式引用。,但是,列表不同于向量,我们每次只能引用一个元素,如,rec1:2,的用法是不允许的。,注意:“列表名,下标,”,或“列表名,下标范围,”,的用法也是合法的,但其意义与用两重括号的记法完全不同,两重记号取出列表的一个元素,结果与该元素类型相同,如果使用一重括号,则结果是列表的一个子列表(结果类型仍为列表)。,列表定义列表是一种特别的对象集合,它的元素也由序号(下标)区, rec = list(name=,李明, age=30, scores=c(85, 76, 90), rec,$name,1 ,李明,$age,1 30,$scores,1 85 76 90, rec1,$name,1 ,李明, rec1,1 ,李明, rec2,$age,1 30, rec2,1 30, rec3,$scores,1 85 76 90, rec3,1 85 76 90, rec31:2,1 85 76, rec = list(name=李明, age=30,在定义列表时如果指定了元素的名字(如,rec,中的,name,,,age,,,scores,),则引用列表元素还可以用它的名字作为下标,格式为“列表名,元素名,”,,如:, recage,1 30,另一种格式是“列表名,$,元素名”,如:, rec$age,1 30,其中“元素名”可以简写到与其它元素名能够区分的最短程度,比如“,rec$s”,可以代表 “,rec$score”,。,这种写法方便了交互运行,编写程序时一般不用简写以免降低程序的可读性。,在定义列表时如果指定了元素的名字(如rec中的name,ag,使用元素名的引用方法可以让我们不必记住某一个下标代表那一个元素,而直接用易记的元素名来引用元素。事实上,已知向量和矩阵也可以指定元素名、行名、列名。,定义列表使用,list(),函数,每一个自变量变成列表的一个元素,自变量可以用“名字值”的方式给出,即给出列表元素名。,自变量的值被复制到列表元素中,自变量如果是变量并不会与该列表元素建立关系(改变该列表元素不会改变自变量的值)。,使用元素名的引用方法可以让我们不必记住某一个下标代表那一个元,修改列表,列表的元素可以修改,只要把元素引用赋值即可。,如:, rec$age rec$age rec$sex rec6 rec,修改列表 列表的元素可以修改,只要把元素引用赋值即可。, rec$sex rec6 rec,$name,1 ,李明,$age,1 30,$scores,1 85 76 90,$sex,1 ,男,5,NULL,6,1 161, rec$sex list.ABC ev=eigen(1:3)%o%(1:3), ev,$values,1 1.400000e+01 9.176554e-16 -1.023391e-15,$vectors,1 ,2 ,3,1, -0.2672612 0.6067775 0.7485937,2, -0.5345225 0.5530299 -0.6390960,3, -0.8017837 -0.5709457 0.1765328,特征向量按矩阵存放,每一列为一个,特征,向量。,一、特征值和特征向量,二、奇异值分解及行列式,函数,svd(),进行奇异值分解,自学,三、最小二乘拟合与,QR,分解,函数,lsfit(x,y),返回最小二乘拟合的结果。最小二乘的模型为线性模型,lsfit(x,y),的第一个参数,x,为模型中的设计阵 ,第二个参数,y,为模型中的因变量,y,(可以是一个向量也可以是一个矩阵),返回一个列表,成员,coefficients,为上面模型的 最小二乘系数,成员,residuals,为拟合残差,成员,intercept,用来指示是否有截距项,成员,qr,为设计阵 的,QR,分解,它本身也是一个列表。,二、奇异值分解及行列式三、最小二乘拟合与QR分解,三、最小二乘拟合与,QR,分解,关于最小二乘拟合还可参见,ls.diag(),函数(查看帮助)。,函数,qr(x),返回,x,的,QR,分解结果。矩阵,X,的,QR,分解为,X=Q*R,,,Q,为对角线元素都等于,1,的下三角阵,,R,为上三角阵。,函数结果为一个列表,成员,qr,为一个矩阵,其上三角部分(包括对角线)分解的,R,,其下三角部分(不包括对角线)为分解的,Q,。其它成员为一些辅助信息。, x=rbind(c(1,2,3),c(4,5,6),c(7,8,9), y=qr(x), y, qr.R(y), qr.Q(y), qr.Q(y)%*%qr.R(y),三、最小二乘拟合与QR分解 x=rbind(c(1,2,3, x=rbind(c(1,2,3),c(4,5,6),c(7,8,9), y=qr(x), y,$qr,1 ,2 ,3,1, -8.1240384 -9.6011363 -1.107823e+01,2, 0.4923660 0.9045340 1.809068e+00,3, 0.8616404 0.9954736 -2.220446e-16,$rank,1 2,$qraux,1 1.123091e+00 1.095039e+00 2.220446e-16,$pivot,1 1 2 3,attr(,class),1 qr, x=rbind(c(1,2,3),c(4,5,6),c(, qr.R(y),1 ,2 ,3,1, -8.124038 -9.601136 -1.107823e+01,2, 0.000000 0.904534 1.809068e+00,3, 0.000000 0.000000 -2.220446e-16, qr.Q(y),1 ,2 ,3,1, -0.1230915 0.9045340 0.4082483,2, -0.4923660 0.3015113 -0.8164966,3, -0.8616404 -0.3015113 0.4082483, qr.Q(y)%*%qr.R(y),1 ,2 ,3,1, 1 2 3,2, 4 5 6,3, 7 8 9, qr.R(y),数据框(,data.frame,),数据框是,S,中类似,SAS,数据集的一种数据结构。它通常是矩阵形式的数据,但矩阵,各列可以是不同类型,的。数据框每列是一个变量,每行是一个观测。,数据框有更一般的定义。它是一种特殊的列表对象,有一个值为“,data.frame”,的,class,属性,各列表成员必须是向量(数值型、字符型、逻辑型)、因子、数值型矩阵、列表,或其它数据框。向量、因子成员为数据框提供一个变量,如果向量,非数值型则会被强制转换为因子,,而矩阵、列表、数据框这样的成员为新数据框提供了和其列数、成员数、变量数相同个数的变量。作为数据框变量的向量、因子或矩阵必须具有相同的长度(行数)。,尽管如此,我们一般还是可以把数据框看作是一种推广了的矩阵,它可以用矩阵形式显示,可以用对矩阵的下标引用方法来引用其元素或子集。,数据框(data.frame) 数据框是S中类似SAS数据集,数据框生成,数据框可以用,data.frame(),函数生成,其用法与,list(),函数相同,各自变量变成数据框的成分,自变量可以命名,成为变量名。例如:, d=data.frame(name=c(,赵, ,钱, ,孙, ,李,王,),age=c(20,21,22,21,20),height=,c(170,171,175,165,181),gender=c(,男, ,女, ,男, ,女, ,男, ), d,如果一个列表的各个成分满足数据框成分的要求,它可以用,as.data.frame(),函数强制转换为数据框。比如,上面的,d,如果先用,list(),函数定义成了一个列表,就可以强制成为一个数据框。,一个矩阵可以用,data.frame(),转换为一个数据框,如果它原来有列名则其列名被作为数据框的变量名,否则系统自动为矩阵的各列起一个变量名(如,X1,,,X2,)。,数据框生成数据框可以用data.frame()函数生成,其用, d,name age height gender,1,赵,20 170,男,2,钱,21 171,女,3,孙,22 175,男,4,李,21 165,女,5,王,20 181,男, d1,name,1,赵,2,钱,3,孙,4,李,5,王, d1,1,赵 钱 孙 李 王,Levels:,李 钱 孙 王 赵, d22:3,1 21 22, d d1,数据框引用,引用数据框元素的方法与引用矩阵元素的方法相同,可以使用下标或下标向量,也可以使用名字或名字向量。如,d1:2, 2:3,。数据框的各变量也可以用按列表引用(即用双括号,或,$,符号引用)。,数据框的变量名由属性,names,定义,此属性一定是非空的。数据框的各行也可以定义名字,可以用,rownames,属性定义。如:, names(d),1 name age height gender, rownames(d),1 1 2 3 4 5,数据框引用 引用数据框元素的方法与引用矩阵元素的方法相同,可, table(d4),男 女,3 2, table(d4),男 女,3 2, tapply(d3,d4, mean),男 女,175.3333 168.0000, tapply(d3,d4, mean),错误在,tapply(d3, d4, mean) :,变元的长度必需相同, d3/d2,1 8.500000 8.142857 7.954545 7.857143 9.050000, table(d4),attach(),函数,数据框的主要用途是保存统计建模需要的数据。,S,的统计建模功能都需要以数据框为输入数据。我们也可以把数据框当成一种矩阵来处理。,在使用数据框的变量时可以用“数据框名,$,变量名”的记法。但是,这样使用较麻烦,,S,提供了,attach(),函数可以把数据框“连接”入当前的名字空间。例如,, attach(d), r d$r cat(i = , i, n),注意使用,cat(),时要自己加上换行符“,n”,。它把各项转换成字符串,中间隔以空格连接起来,然后显示。,如果要使用自定义的分隔符,可以用,sep=,参数,例如:, cat(c(AB, C), c(E, F), n, sep=) ABCEF,cat(),还可以指定一个参数,file=,给一个文件名,可以把结果写到指定的文件中,如:, cat(i = , 1, n, file=c:/work/result.txt),cat()函数也用来输出,但它可以把多个参数连接起来再输出(,如果指定的文件已经存在则原来内容被覆盖。加上一个,append=TRUE,参数可以不覆盖原文件而是在文件末尾附加,这很适用于运行中的结果记录。,cat(),函数和,print(),都不具有很强的自定义格式功能,为此可以使用,cat(),与,format(),函数配合实现。,format(),函数为一个数值向量找到一种共同的显示格式然后,把向量转换为字符型,。例如:, format(c(1, 100, 10000),1 1 100 10000,S-PLUS,中的,format(),函数功能较强,具有较多的控制参数,请参见帮助。,R,中目前,format(),函数功能仍较弱,但,R,有一个,formatC,函数可以提供类似,C,语言的,printf,格式功能。,formatC,对输入向量的每一个元素单独进行格式转换而不生成统一格式,例如:, formatC(c(1, 10000),1 1 1e+004,如果指定的文件已经存在则原来内容被覆盖。加上一个append,在,formatC(),函数中可以用,format=,参数指定,C,格式类型,如“,d”,(整数),“,f”,(定点实数),“,e”,(科学记数法),“,E”, “g”,(选择位数较少的输出格式),“G”, “fg”,(定点实数但用,digits,指定有效位数),“,s”,(字符串)。,可以用,width,指定输出宽度,用,digits,指定有效位数(格式为,e,E,g,G,fg,时)或小数点后位数(格式为,f,)时。可以用,flag,参数指定一个输出选项字符串,字符串中有,-,表示输出左对齐,有,0,表示左空白用,0,填充,有,+,表示要输出正负号,等等。例如,我们有一个矩阵,da,中保存了三个日期的年、月、日:, da,1 ,2 ,3,1, 99 1 3,2, 96 11 9,3, 65 5 18,在formatC()函数中可以用format=参数指定C格式,为了输出这三个日期,可以用,apply,函数指定对每一行作用一个输出函数,此输出函数利用,cat(),和,formatC,来控制:, apply(da, 1, function(r) cat(formatC(r1, format=d, width=2, flag=0), -, formatC(r2, format=d, width=2, flag=0), -, formatC(r3, format=d, width=2, flag=0), n, sep=),99-01-03 96-11-09 65-05-18 NULL,这里我们知道,apply,函数第一个参数指定了一个矩阵,第二个参数说明对行操作还是对列操作,第三个参数是一个函数,这里我们使用了直接定义一个函数作为参数的办法。输出结果中多了一个,NULL,函数,这是因为我们在交互运行,,apply,的结果作为一个表达式的值(,NULL,)会被显示出来。,为避免显示,可以把结果赋给一个临时变量名,或者把整个表达式作为,invisible(),函数的参数,这时不显示表达式值。,为了输出这三个日期,可以用apply函数指定对每一行作用一个,S,的输出缺省显示在交互窗口。可以用,sink(),函数指定一个文件以把后续的输出转向到这个文件,并可用,append,参数指定是否要在文件末尾附加:, sink(“E:/work/result.txt, append=TRUE), ls(), d, sink(),调用无参数的,sink(),把输出恢复到交互窗口。,S的输出缺省显示在交互窗口。可以用sink()函数指定一个文,write(t(x),file=,文件名,,nol=nol(x),把一个矩阵,X,输出到文件中,把,X,转置后输出因为,R,中矩阵是列优先的,如果不转置则输出是按列输出的。如果不指定列数则缺省使用,5,列。文件名缺省用,data.,write.table(x,file=,文件名,),把数据框,X,输出到文件中,输出包括变量名表头和行名。,.,cl = read.table(“E:/R/class.txt, as.is=c(1),+ col.names=c(Name, Sex, Age, Height, Weight),cl,write(t(x),file=文件名,nol=nol(,输入,为了从外部文件读入一个数值型向量,,S,提供了,scan(),函数。如果指定了,file,参数(也是第一参数),则从指定文件读入,缺省情况下读入一个数值向量,文件中各数据以空白分隔,读到文件尾为止。例如:, cat(1:12, n, file=E:/work/result.txt), x y x x,V1 V2 V3,1 Zhou 15 3,2 Li Ming 9,李明,3 Zhang 10.2 Wang,读入结果为数据框。,函数可以自动识别表列是数值型还是字符型,并在缺省情况下把字符型数据转换为因子(加上,as.is=T,可以保留字符型不转换)。,函数自动为数据框变量指定“,V1 ”,、“,V2”,这样的变量名,指定“,1”,、“,2”,这样的行名。可以用,col.names,参数指定一个字符型向量作为数据框的变量名,用,row.names,参数指定一个字符型向量作为数据框的行名。,用read.table读入:,read.table(),可以读入带有表头的文件,只要加上,header=TRUE,参数即可。可以用,sep,参数指定表行各项的分隔符。例如,为了读入如下带有表头的逗号分隔文件,E:d.csv,:,Name,score, cn,Zhou,15,3,Li Ming, 9,李明,Zhang, 10.2, Wang,使用如下语句:, x=read.table(E:/d.csv, header=T, sep=,), x,Name score cn,1 Zhou 15.0 3,2 Li Ming 9.0,李明,3 Zhang 10.2 Wang,其它一些用法见帮助。,read.table()可以读入带有表头的文件,只要加上he,cl =read.table(E:/R/class.txt, as.is=c(1), col.names=c(Name, Sex, Age, Height, Weight);,cat(names(cl),names(cl);,class.data=read.table(E:/R/class.csv,header=T,sep=,);,cat(names(class.data),names(class.data);,Edata = read.table(E:/R/Employee data.csv,header=T,sep=,),cat(names(Edata),names(Edata);,cl =read.table(E:/R/class.txt,read.spss package:foreign R Documentation,Read an SPSS data file,Description: read.spss reads a file stored by the SPSS save and export,commands and returns a list.,Usage: read.spss(file, use.value.labels=TRUE, to.data.frame=FALSE, max.value.labels=Inf, trim.factor.names=FALSE),Arguments:,file: character variable with the name of the file to read.,use.value.labels: Convert variables with value labels into R factors with those levels?,to.data.frame: return a data frame?,max.value.labels: Only variables with at most this many unique values will be converted to factors,trim.factor.names: Trim trailing spaces from factor levels?,read.spss package:foreig,Details: This uses modified code from the PSPP project for reading the SPSS formats.,Occasionally in SPSS value labels will be added to some values of a continuous variable (eg to distinguish different types of missing data), and you will not want these variables converted to factors. By setting max.val.labels you can specify that variables with a large number of distinct values are not converted to factors even if they have value labels. In addition, variables will not be converted to factors if there are non-missing values that have no value label. The value labels are then returned in the value.labels attribute of the variable.,If SPSS variable labels are present, they are returned as the variable.labels attribute of the answer. Fixed length strings (including value labels) are padded on the right with spaces by SPSS, and so are read that way by R. See the examples for sub for ways to remove trailing spaces in string data.,Details: This uses modifie,Value:,A list (or data frame) with one component for each variable in the saved data set.,Note: If SPSS value labels are converted to factors the underlying numerical codes will not in general be the same as the SPSS numerical values, since the numerical codes in R are always 1,2,3,.,Author(s): Saikat DebRoy,Examples:,# Not run:,read.spss(datafile),# dont convert value labels to factor levels,read.spss(datafile,use.value.labels=FALSE),# convert value labels to factors for variables with at most,# ten distinct values.,read.spss(datafile,max.val.labels=10),# End(Not run),Value:,实验目的,实验内容,学习,S,语言中程序设计方法,1,、,程序设计,方法,2,、应用实例,3,、实验作业,程序设计,实验目的实验内容学习S语言中程序设计方法1、程序设计方法程序,程序控制结构,?,是一个表达式语言,其任何一个语句都可以看成是一个表达式。表达式之间以分号分隔或用换行分隔。表达式可以续行,只要前一行不是完整表达式(比如末尾是加减乘除等运算符,或有未配对的括号)则下一行为上一行的继续。,若干个表达式可以放在一起组成一个复合表达式,作为一个表达式使用。组合用大括号表示,如:, , x x ,S,语言也提供了其它高级程序语言共有的分支、循环等程序控制结构。,程序控制结构 ?是一个表达式语言,其任何一个语句都可以看成,分支结构,分支结构包括,if,结构:,if (,条件,),表达式,1,或,if (,条件,),表达式,1 else,表达式,2,其中的“条件”为一个标量的真或假值,表达式可以是用大括号包围的复合表达式。有,else,子句时一般写成:,if(,条件,),表达式组, ,else ,表达式组, ,这样的写法可以使,else,不至于脱离前面的,if,。,分支结构 分支结构包括if结构:,例如,如果变量,lambda,为缺失值就给它赋一个缺省值,可用:,if(is.na(lambda) lambda 0) & all(log(x)0), y 0) 1 else 0,当,x,是标量时这个定义是有效的,但是当自变量,x,是一个向量时,比较的结果也是一个向量,这时条件无法使用。所以,这个分段函数应该这样编程:,y= numeric(length(x),yx0 - 1,yx=0 - 0,有多个,if,语句时,else,与最近的一个配对。可以使用,if . else if . else if . else .,的多重判断结构表示多分支。多分支也可以使用,switch(),函数。,在用S编程序时一定要时刻牢记S是一个向量语言,几乎所有操作都,循环结构,循环结构中常用的是,for,循环,是对一个向量或列表的逐次处理,格式为“,for(,name,in,values,),表达式”,如:,for(i in seq(along=x) cat(x(, i, ) = , xi, n, sep=); s - s+xi; ,这个例子我们需要使用下标的值,所以用,seq(along=x),生成了,x,的下标向量。,如果不需要下标的值,可以直接如此使用:,for(xi in x), cat(xi, n),s x = numeric(364), for(i in 1:364), xi= 1,for(j in 0:(i-1),xi= xi * (365-i)/365,xi x for(n in 1:364), xn =1 - prod(365:(365-n+1)/365) ,这段程序只用了,1,秒。注意不能直接去计算,365!,,这会超出数值表示范围。, x = numeric(364),另外要注意使用,for(i in 1:n),格式的计数循环时要避免一个常见错误,即当,n,为零或负数时,1:n,是一个从大到小的循环,而我们经常需要的是当,n,为零或负数时就不进入循环。为达到这一点,可以在循环外层判断循环结束值是否小于开始值。,while,循环是在开始处判断循环条件的当型循环,如:,While (b-aeps), c 0) b - c else a ls(),工作空间管理前面我们已经提到,S在运行时保持一个变量搜索路径,1 A Ai b cl cl.f fit1 g1 marks ns,10 p1 rec 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(),删除所有对象。,1 A Ai b cl cl.f,函数定义,S,中函数定义的一般格式为“函数名,= function(,参数表,),表达式”。定义函数可以在命令行进行,例如, hello = function() cat(Hello, worldn) ;,cat(n) ;, hello,function () cat(Hello, worldn) ;cat(n) ;, hello(),Hello, world,函数定义 S中函数定义的一般格式为“函数名= functio,函数体为一个复合表达式,各表达式的之间用换行或分号分开。不带括号调用函数显示函数定义,而不是调用函数。,在命令行输入函数程序很不方便修改,所以我们一般是打开一个其他的编辑程序(如,Windows,的记事本),输入以上函数定义,保存文件,比如保存到了,C:Rhello.R,,我们就可以用, source(“E:/R/hello.R),运行文件中的程序。实际上,用,source(),运行的程序不限于函数定义,任何,S,程序都可以用这种方式编好再运行,效果与在命令行直接输入是一样的。,函数体为一个复合表达式,各表达式的之间用换行或分号分开。不带,对于一个已有定义的函数,可以用,fix(),函数来修改,如:, fix(hello),将打开一个编辑窗口显示函数的定义,修改后关闭窗口函数就被修改了。,fix(),调用的编辑程序缺省为记事本,可以用“,options(editor=,编辑程序名,)”,来指定自己喜欢的编辑程序。,函数可以带参数,可以返回值,例如:,larger = function(x, y) y.is.bigger= (yx);,xy.is.bigger = yy.is.bigger; x; ,这个函数输入两个向量(相同长度),x,和,y,,然后把,x,中比,y,对应元素小的元素替换为,y,中对应元素,返回,y,的值。,S,返回值为函数体的最后一个表达式的值,不需要使用,return(),函数。不过,也可以使用“,return(,对象,)”,函数从函数体返回调用者。,对于一个已有定义的函数,可以用fix()函数来修改,如:,参数(自变量),函数可以带虚参数(形式自变量)。,S,函数调用方式很灵活,例如,如下函数:,fsub =function(x, y) x-y,有两个虚参数,x,和,y,,我们用它计算,100,45,,可以调用,fsub(100,45),,或,fsub(x=100,y=45),,或,fsub(y=45, x=100),,或,fsub(y=45, 100),。即调用时实参与虚参可以按次序结合,也可以直接指定虚参名结合。实参先与指定了名字的虚参结合,没有指定名字的按次序与剩下的虚参结合。,函数在调用时可以不给出所有的实参,这需要在定义时为虚参指定缺省值。例如上面的函数改为:,fsub = function(x, y=0) x-y,则调用时除了可以用以上的方式调用外还可以用,fsub(100),,,fsub(x=100),等方式调用,只给出没有缺省值的实参。,参数(自变量) 函数可以带虚参数(形式自变量)。S函数调用方,即使没有给虚参指定缺省值也可以在调用时省略某个虚参,然后函数体内可以用,missing(),函数判断此虚参是否有对应实参,如:,trans = function(x, scale) if(!missing(scale) x = scale*x ,此函数当给了,scale,的值时对自变量,x,乘以此值,否则保持原值。这种用法在其它语言中是极其少见的,,S,可以实现这一点是因为,S,的函数调用
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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