当前位置:天才代写 > tutorial > 其他教程 > 如何编写R函数

如何编写R函数

2017-12-05 08:00 星期二 所属: 其他教程 浏览:404

 
R语言实际上是函数的荟萃,用户可以利用base,stats等包中的根基函数,也可以本身编写函数完成必然的成果。可是初学者往往认为编写R函数十分坚苦,可能难以领略。这里对如何编写R函数举办扼要的先容。

函数是对一些措施语句的封装。换句话说,编写函数,可以淘汰人们对反复代码书写,从而让R剧本措施更为简捷,高效。同时也增加了可读性。一个函数往往完成一项特定的成果。譬喻,求尺度差sd,求平均值,求生物多样性指数等。R数据阐明,就是依靠挪用各类函数来完成的。可是编写函数也不是垂手可得就能完成的,需要首先颠末大量的编程练习。出格是对R中数据的范例,逻辑鉴别、下标、轮回等内容有必然相识之后,才好开始编写函数。
对付初学者来说,较好的要领就是研究现有的R函数。因为R措施包都是开源的,所有代码可见。研究现有的R函数可以或许使编程程度迅速提高。

R函数无需首先声明变量的范例,大部门环境下不需要举办初始化。一个完整的R函数,需要包罗函数名称,函数声明,函数参数以及函数体几部门。

1.
函数名称,即要编写的函数名称,这一名称就作为未来挪用R函数的依据。

2. 函数声明,包罗 <- function,
即声明该工具的范例为函数。

3.
函数参数,这里是输入的数据,函数参数是一个虚拟出来的一个工具。函数参数所便是的数据,就是在函数体内部将要处理惩罚的值,可能对应的数据范例。
函数体内部的措施语句举办数据处理惩罚,就是对参数的值举办处理惩罚 ,这种处理惩罚只在挪用函数的时候才会产生。函数的参数可以有多种范例。R
help的界面临每个函数,及其参数的意义及所需的数据范例都举办了说明。

4. 函数体

经常包罗三部门.

(1).
异常处理惩罚

输入的数据不能满意函数计较的要求,可能范例不符, 这时候必然要设计相应的机制汇报用户,输入的数据在什么处所有错误。
错误又分为两种。

第一种, 假如输入的数据错误不是很严重,可以颠末转换,变为切合处理惩罚要求的数据时,
此时只需要给用户一个提醒,奉告数据范例不符,可是函数自己已经 举办了相应的转换。

第二种,数据完全不切合要求,这种环境下,就
要终止函数的运行,而奉告因为什么,函数不能运行。这样,用户在 利用函数的环境先才不至于茫然。

(2).
运算进程

包罗详细的运算步调。 运算进程和该函数要完成的成果有关。

R运算进程中,应该只管淘汰轮回的利用,出格是嵌套轮回。R提供了
apply,replicate等一系列函数,来取代轮回,应该只管应用这些函数, 提高效率。 假如在R中实在太慢,那么焦点部门只能依靠C可能Fortran
等语言编写,然后再用R挪用这些编译好的模块,到达更高的效率。

运算进程中,需要大量用到if等条件作为判此外尺度。if和while都是需要数据TRUE/FALSE这样的逻辑范例变量,这就意味着,if内部,往往是对条件的鉴别,譬喻
is.na, is.matrix, is.numeric等等,可能对巨细的较量,如,if(x > 0), if(x == 1),
if(length(x)==
3)等等。if后头,假如是1行,则花括号可以省略,不然就必需要将所有的语句都放在花括号中。这和轮回是一致的。

例子1

##
if与条件判定

fun.test <- function(a, b, method = “add”){

if(method == “add”) { ## 假如if可能for/while;

res <- a + b
## 等后头的语句只有一行,则无需利用花括号。

}

if(method ==
“subtract”){

res <- a – b

}

return(res) ## 返回值

}

### 检讨功效

fun.test(a = 10, b
= 8, method = “add”)

fun.test(a = 10, b = 8, method =
“substract”)

for轮回有些时候是必需要用到的,for轮回内部,往往需要用下标,会见数据内的必然元素,譬喻向量内的元素,这时候用方括号暗示。一维的数据组合,可能数组,经常称为向量。二维的数据组合,往往称为矩阵,可能数据框。详细的会见方法主要是方括号内部有没有逗号的区别。for轮回可能while轮回有时候让人以为较量狐疑,大概需要专门的时间举办讲授。

例2

###
for轮回与算法

test.sum <- function(x)

{

res <-
0 ### 配置初始值,在第一次轮回的时候利用

for(i in
1:length(x)){

res <- res + x[i] ##
这部门是算法的焦点,

##老是总右面开始计较,功效存到左边的工具

}

return(res)

}

### 检讨函数

a <-
c(1,2,1,6,1,8,9,8)

test.sum(a)

sum(a)

无论是什么样的函数,算法才是最要害的。往往需要巧妙得设计较法,让函数快捷高效。

(3).
返回值。

返回值就是函数给出的功效。打个例如,编写一个函数,就像本身攒一个呆板,譬喻此刻攒好
一台豆乳机,该豆乳秘密求输入大豆,输入的大豆就是参数, 返回的功效,就是豆乳。假如该豆乳机需要不断地输入大豆,
而不能产出豆乳,这样的呆板就必然会被扔掉。函数也是一样的, 需要给出返回值。
R中默认的环境是将最后一句作为返回值。可是为了函数的可读性起见,应该只管指名返回值。返回值用return()函数给出。
函数在内部处理惩罚进程中,一旦碰着return(),就会终止运行,
将return()内的数据作为函数处理惩罚的功效给出。

下面举例说明R函数的编写要领。

例3 计较尺度差

sd2
<- function(x)

{

# 异常处理惩罚,当输入的数据不是数值范例时报错

if(!is.numeric(x)){

stop(“the input data
must be numeric!\n”)

}

# 异常处理惩罚,当仅输入一个数据的时候,奉告不能计较尺度差

if(length(x) ==
1){

stop(“can not compute sd for one
number,

a numeric vector required.\n”)

}

## 初始化一个姑且向量,生存轮回的功效,

## 求每个值与平均值的平方

x2 <-
c()

## 求该向量的平均值

meanx <- mean(x)

## 轮回

for(i in 1:length(x)){

xn <- x[i] – meanx

x2[i] <- xn^2

}

## 求总平方和

sum2
<- sum(x2)

# 计较尺度差

sd <-
sqrt(sum2/(length(x)-1))

# 返回值

return(sd)

}

## 措施的检讨

##
正常的环境

sd2(c(2,6,4,9,12))

## 一个数值的环境

sd2(3)

##
输入数据不为数值范例时

sd2(c(“1”,
“2”))

这样,一个完整的函数就编写完成了。虽然,实际环境下,函数往往更为巨大,大概要上百行。可是好的编程人员往往将巨大的函数编写成小的函数。以便于措施的修改和维护,纵然个中呈现错误,也很好修改。

再有就是编写R函数时必然要留意缩进,编辑器用Notepad++,
TinnR, Rstudio等,同时用等距字体(如Consolas, Courier new等)和语法高亮显示。这样便于快速寻找到个中的错误。

 

    关键字:

天才代写-代写联系方式