版权声明: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"