# R学习笔记5 R中函数的定义与使用

版权声明:All rights reserved by LK12, reprint please explain the source https://blog.csdn.net/qq_40527086/article/details/83017354

R学习笔记5 R中函数的定义与使用

1.创建函数

1.1 创建一个简单的函数

创建一个把输入参数加一输出的函数

addOne = function(x){
x = x+1
} #如果函数体内只有一行代码,也可以省掉花括号
new_x = addOne(x = c(1,2,3))
new_x 
>[1] 2 3 4

注意,创建一些函数时可能会导致系统自带函数被覆盖,调用优先级发生改变。如系统本来有自定义的median函数,如果我们再重新定义,原函数就会被覆盖。可以使用find(functionName)来查看存在该函数的工作区。

1.2 创建多参数的函数

前面我们涉及到的只含有一个参数,其实多个参数也一样,如把两个数相加的函数

myAdd = function(a,b){
a +b
}
c =  myAdd(1,2)
c
>[1] 3

可以为参数设定默认值
如:

myAdd = function(a,b=2){
a +b
}
c =  myAdd(a = 1)
c
>[1] 3

函数返回对象

值得注意的是,R中只允许返回一个对象,如果确实想返回多个可以通过返回一个组合列表的形式来实现。

1.3 简化逻辑输入的函数

假设有这样一个需求,输入参数后。默认之下对其进行对数化操作,也可以更改默认参数使其不进行操作。

logOrNot = function(x,logFlag = T){
if(logFlag) x  =log(x)
else x = x
x
}
logOrNot(x  =c(1,2,3))
>[1] 0.0000000 0.6931472 1.0986123
logOrNot(x  =c(1,2,3),logFlag = T)
[1] 1 2 3

2.函数的一些常见操作

2.1 使用return(x)提前返回一个对象。
2.2 使用混合条件进行判断,&和&&是有区别的,如test1&test2和test1&&test2,前者两边都会求值然后进行判断,后者只有在第一个值求值后满足条件才会对右边第二个值进行判断。
2.3 使用!反转逻辑值。
2.4 函数命名采用驼峰式命名,如myFun,以小写字母开头。

3.错误和警告处理

在上面的对数函数中,如果用户输入负数,则会发生错误。在特定的情况下,对于某种需求,即使为负数计算不会报错,但是我们不允许有负数输入,这是在判断条件后可以输出警告信息被对数据进行处理。
输出错误信息并停止的函数为stop(‘messgae’)
输出错误信息但不停止的函数为warning(‘messgae’)

4.检查输入

由于我们设计的函数是处理特定类型的数据结构,所以我们首先应该判断输入类型是否正确。
为此,R提供了大量以‘is.'开头的函数

apropos('^is\\.')
>[1] "is.array"                "is.atomic"               "is.call"                
 [4] "is.character"            "is.complex"              "is.data.frame"          
 [7] "is.double"               "is.element"              "is.empty.model"         
[10] "is.environment"          "is.expression"           "is.factor"              
[13] "is.finite"               "is.function"             "is.infinite"            
[16] "is.integer"              "is.language"             "is.leaf"                
[19] "is.list"                 "is.loaded"               "is.logical"             
[22] "is.matrix"               "is.mts"                  "is.na"                  
[25] "is.na.data.frame"        "is.na.numeric_version"   "is.na.POSIXlt"          
[28] "is.na<-"                 "is.na<-.default"         "is.na<-.factor"         
[31] "is.na<-.numeric_version" "is.name"                 "is.nan"                 
[34] "is.null"                 "is.numeric"              "is.numeric.Date"        
[37] "is.numeric.difftime"     "is.numeric.POSIXt"       "is.numeric_version"     
[40] "is.object"               "is.ordered"              "is.package_version"     
[43] "is.pairlist"             "is.primitive"            "is.qr"                  
[46] "is.R"                    "is.raster"               "is.raw"                 
[49] "is.recursive"            "is.relistable"           "is.single"              
[52] "is.stepfun"              "is.symbol"               "is.table"               
[55] "is.ts"                   "is.tskernel"             "is.unsorted"            
[58] "is.vector"              

猜你喜欢

转载自blog.csdn.net/qq_40527086/article/details/83017354