微信号:gh_61e2455df34c

介绍:介绍R语言的学习和使用,关注数据挖掘算法,利用R语言实现常见的数据挖掘算法,并配以有趣的NBA数据分析案例.不管您是初学还是精通R语言,本平台都致力于让您能从中获益.

编写属于你自己的R函数

2016-07-14 12:03 №→★飞刀

R是函数式编程语言,其大部分功能都是用函数实现的,比如求均值用mean函数,基本绘图用plot函数,建立线性回归模型用lm函数。如果你想用R做数据分析必定离不开R函数的编写,那么本文就来讲一下如何用R来实现函数的编写。

R函数主要包括函数声明,参数,主体以及返回值四个部分。


这几个部分中,函数声明是必须的,参数用来设置函数的输入,可以是一个也可以是多个,函数主体部分由若干R语句组成,用来实现函数的具体功能,返回值为函数的输出。

函数声明

函数声明以函数名、赋值符号以及function构成,它是R里面函数的范式,约定俗成的规则,只要遵循就是了。

参数设置

参数分为必选参数和默认参数。必选参数,顾名思义在创建好函数之后调用该函数的同时必须设置参数值;默认参数即给定默认值,默认参数在调用函数的时候不用填写,除非需要变更给定的默认值。

主体

函数主体由具体的实现函数功能的R代码语句构成,具体代码编写会涉及到异常处理语句,控制流语句,功能实现语句以及返回值等。

异常处理

R里面的异常分为warning和error两种,warning不妨碍函数的运行,但error会终止程序,可能无法得到返回值,在使用的时候要慎重

error可以采用stopifnot或者stop命令抛出

控制流

几种常用的控制流

条件判断语句   if else   

循环语句  while   repeat  for

跳出循环  next  break

返回值

函数在定义的时候可以没有返回值,这个跟函数实现的功能相关,例如函数实现的是文件读写、画图等功能时。

如需设置返回值,一般用return来返回

函数示例

下面我们编写一个示例函数,该函数实现了提取单个球员职业生涯最高得分或者该球员所属球队名称的功能,输入参数有两个,分别是球员姓名(必选参数),输出类型(可选参数),输出为该球员对应的得分或者球队名。

myfun <- function(name,status=c("score","height")){

  ## Arguments:

   # name   --  name of NBA player

   # status --  data type

  ## Return:

   # result --  related data about NBA player

  # Verify Arguments

  stopifnot(is.character(name),length(name)==1)

  status <- match.arg(status)

  # Data source

  dat <- data.frame(name=c("Pual","Kobe","James","Duncan","O'Neal"),

                    height=c(183,198,206,211,216),

                    score=c(43,81,61,53,61),

                    team=c("Clippers","Lakers","Cavaliers","Lakers","Spurs"),

                    stringsAsFactors = F)

  # Format and return results

  index <- match(name,dat$name)

  if(is.na(index)){

    result <- paste("There is no data about ",name,sep="")

  } else if(status=="score"){

    score <- dat$score[index]  # Extract highest score data

    result <- paste("The highest score of " ,name,"'s career was ",score,sep="") 

  } else {

    height <- dat$height[index] # Extract height data

    result <- paste(name,"'s height is ",height,sep="") 

  }

  return(result)

}

> myfun(123,status = "s")

Error: 不是所有的is.character(name)都是TRUE

> myfun("Durant",status = "s")

[1] "There is no data about Durant"

> myfun("Kobe",status = "s")

[1] "The highest score of Kobe's career was 81"

> myfun("James",status = "s")

[1] "The highest score of James's career was 61"

> myfun("Pual",status = "h")

[1] "Pual's height is 183"



 本文来自№→★飞刀的微信公共帐号“数据挖掘与R语言”,用微信添加数据挖掘与R语言公众号,即可订阅。转载必须保留作者、公共帐号信息。 

长按识别图中二维码



 
数据挖掘与R语言 更多文章 数据处理之——plyr xgboost:速度快效果好的Boosting模型 数据处理之——dplyr 数据处理之——data.table 数据挖掘十大算法
猜您喜欢 7本机器学习领域的电子书 《神秘的程序员们》漫画连载50-别人的记忆 Android Studio 2.0 真的来了! ProtoBuf 与 gRPC 你需要知道的知识 马云的技术合伙人,人家牛逼是种习惯