首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

R基础课(5)

R基础课(5)

16) 编写函数
R语言允许用户创建自己的函数(function)对象,如mean(), var(),postscript() 等等,这些函数都是用R 写的,因此在本质上和用户写的没有差别。
一个函数是通过下面的语句形式定义的,
name <- function(args, ...) {}其中expression 是一个R 表达式(常常是一个成组表达式),它利用参数argi 计算最终 的结果。该表达式的值就是函数的返回值。 可以在任何地方以name(expr1 , expr2 , …) 的形式调用函数。
函数定义如下:
twosam <- function(y1, y2) {    n1 <- length(y1); n2 <- length(y2)    yb1 <- mean(y1); yb2 <- mean(y2)    s1 <- var(y1); s2 <- var(y2)    s <- ((n1-1)*s1 + (n2-1)*s2)/(n1+n2-2)    tst <- (yb1 - yb2)/sqrt(s*(1/n1 + 1/n2))    tst}a<-1:3;b<-5:7twosam(a,b)参数命名和默认值
和产生正则序列一样,如果被调用函数的参数以"name=object"方式给出,它们可以用任何顺序设置。但是,参数赋值序列可能以未命名的,位置特异性的方式给出,同时也有可能在这些位置特异性的参数后加上命名参数赋值。 因此,如果有下面方式定义的函数fun1
fun1 <- function(data, data.frame, graph, limit) {}… 参数
一个函数的参数设置可以传递给另外一个函数。这个可以通过给函数增加一个额外的参数来实现。
举例如plot
plotfunction (x, y, ...)在函数中赋值
注意任何在函数内部的普通赋值都是局部的暂时的,当退出函数时都会丢失。因此函数中的赋值语句X <- qr(X) 不会影响调用该函数的程序赋值情况。“强赋值"操作符 <<- :如果想在一个函数里面全局赋值或者永久赋值
fscope<-function(){  a<-1  b<<-2  c=3}作用域
函数内部的变量可以分为三类:形式参数(formal parameters),局部变量(local variables),自由变量(free variables)。
  • 形式参数是出现在函数的参数列表中的变量。它们的值由实际的函数参数绑定形式参数的过程决定的。
  • 局部变量由函数内部表达式的值决定的。既不是形式参数又不是局部变量的变量是自由变量。
  • 自由变量如果被赋值将会变成局部变量
z<-45f <- function(x) {  y <- 2*x  print(x)  print(y)  print(z)}x 是形式参数,y 是局部变量,z 是自由变量。
定制环境
可以修改位置初始化文件,并且每个目录都可以有它特有的一个初始化文件。利用函数.First 和.Last。位置初始化文件的路径可以通过环境变量R PROFILE 设置。这个文件包括你每次执行R时一些自动运行的命令。
类,泛型函数和面向对象
一个对象的类决定了它会如何被一个泛型函数处理。相反,一个泛型函数由参数自身类的种类来决定完成特定工作或者事务的。如果参数缺乏任何类属性,或者在该问题中有一个不能被任何泛型函数处理的类,泛型函数会有一种默认的处理方式。
下面的一个例子使这个问题变得清晰。类机制为用户提供了为特定问题设计和编写泛型函数的便利。在众多泛型函数中,plot() 用于图形化显示对象,summary()用于各种类型的概述分析,以及anova() 用于比较统计模型。 能以特定方式处理类的泛型函数的数目非常庞大。
methods() 得到当前对某个类对象可用的泛型函数列表:
methods(class="data.frame")相反,一个泛型函数可以处理的类同样很多。例如,plot() 有默认的方法和变 量处理对象类"data.frame","density","factor",等等。
一个完整的列表同样可以通过函数methods():
methods(plot)
返回列表