【免责声明:本文用于教学】
08. 自定义函数
1. R语言中,自定义函数的基本格式为:
myfun<-function(arglist){
statements
return(object)
}
其中,myfun为函数名称;arglist为参数列表;大括号中的部分为函数体。
函数体通常包含三部分:
(1)异常处理
输入的数据不能满足函数计算的要求,或者类型不符,应设计异常处理机制提示哪个地方出现错误;
(2)内部处理过程
包括具体的内部处理步骤,与该函数要完成的功能有关;
(3)返回值
用函数return()给出,返回对象的类型是任意的;函数在内部处理过程中,一旦遇到return()就会终止运行函数体,将return()内的数据作为函数处理的结果返回。
2. 自定义函数及调用实例操作
下面自定义函数计算标准差:
(1)先在RStudio的代码编辑窗口编写函数,并保存为
E:办公资料R语言R语言学习系列codesstd2.R
##计算标准差
std2<-function(x)
{
#异常处理
if(!is.numeric(x)){
stop("the input data must be numeric! n")
}
if(length(x)==1){
stop("can not compute std for one number,
a numeric vector required. n")
}
result<-sqrt(sum((x-mean(x))^2)/(length(x)-1))
return(result)
}
(2)调用std2.R
要调用创建好的函数,在命令控制台窗口,先使用
source("std2.R",encoding="utf-8")
注意改到当前路径;若不加encoding="utf-8"将弹出警告信息。
再调用函数即可。
> setwd("E:/办公资料/R语言/R语言学习系列/codes")
> source("std2.R",encoding="utf-8")
> std2(c(2,6,4,9,12))
[1] 3.974921
> std2(3) #输入数据为1个数值,异常处理机制报错
Error in std2(3) : can not compute std for one number,
a numeric vector required.
> std2(c("1","2")) #输入数据不是数值型,异常处理机制报错
Error in std2(c("1", "2")) : the input data must be numeric!
或者创建并运行脚本文件:(选中代码,点run按钮)
练习:理解并使用以下自定义函数
mystats <- function(x, parametric=TRUE, print=FALSE) {
if (parametric) {
center <- mean(x)
spread <- sd(x)
} else {
center <- median(x)
spread <- mad(x)
}
if (print & parametric) {
cat("Mean=", center, "n", "SD=", spread, "n")
} else if (print & !parametric) {
cat("Median=", center, "n", "MAD=", spread, "n")
}
result <- list(center=center, spread=spread)
return(result)
}
要看此函数的实战情况,首先需要生成一些数据(服从正态分布的,大小为500的随机样本):
set.seed(1234)
x <- rnorm(500)
再执行语句:
y <- mystats(x)
之后,y$center将包含均值(0.001 84),y$spread将包含标准差(1.03),并且没有输出结果。
如果执行语句:
y <- mystats(x, parametric=FALSE, print=TRUE)
y$center将包含中位数(–0.0207),y$spread将包含绝对中位差(1.001)。另外,还会输出以下结果:
Median= -0.0207
MAD= 1
练习:下面让我们看一个使用了switch结构的用户自编函数,此函数可让用户选择输出当天日期的格式。在函数声明中为参数指定的值将作为其默认值。在函数mydate()中,如果未指定type,则long将为默认的日期格式:
mydate <- function(type="long") {
switch(type,
long = format(Sys.time(), "%A %B %d %Y"),
short = format(Sys.time(), "%m-%d-%y"),
cat(type, "is not a recognized typen")
)
}
实战中的函数如下:
> mydate("long")
[1] "Monday July 14 2014"
> mydate("short")
[1] "07-14-14"
> mydate()
[1] "Monday July 14 2014"
> mydate("medium")
medium is not a recognized type