函数
通过function()
可以自定义函数,函数的储存与其他的R对象相同,函数对象的类为 “function”。
f <- function(<参数>) {
## R语句
}
R函数也是R对象,可以向其他R对象一样进行操作:
- 函数可以作为参数传递给其他函数
- 函数可以嵌套,可以在函数中包含函数。
- 函数的返回值是函数体中最后一个表达式。
函数的参数
函数的 参数 一般会有默认值。
- 形式参数指的是在函数内定义的参数
-
formals
函数可以查看一个函数所有的形式参数 - 不是每个R函数都需要使用所有的参数
- 函数的参数可以省略或保持默认值。
参数匹配
R函数参数可以通过position matching或name matching进行匹配。以下调用 sd
函数的操作都是等同的。
> mydata <- rnorm(100)
> sd(mydata)
[1] 0.9418245
> sd(x = mydata)
[1] 0.9418245
> sd(x = mydata, na.rm = FALSE)
[1] 0.9418245
> sd(na.rm = FALSE, x = mydata)
[1] 0.9418245
> sd(na.rm = FALSE, mydata)
[1] 0.9418245
虽然这些操作的结果都相同,但为避免造成误解,一般按照将要函数参数的默认顺序来赋值。
可以混合使用position matching和name matching。name matching的优先级高于position matching。
> args(lm)
function (formula, data, subset, weights, na.action, method = "qr",
model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE,
contrasts = NULL, offset, ...)
NULL
下面两种操作等同。
lm(data = mydata, y ~ x, model = FALSE, 1:100)
lm(y ~ x, mydata, 1:100, model = FALSE)
- 命名参数在交互式命令行中使用较多,尤其是参数较多时。
- 命名参数可以帮助记忆函数的参数名称,这在绘图中很有用。
函数参数可以部分匹配,有助于交互式操作。参数匹配的优先级的顺序如下:
- 检查命名参数的精确匹配Check for exact match for a named argument
- 检查局部匹配
- 检查位置匹配
定义函数
f <- function(a, b = 1, c = 2, d = NULL) {
}
如果不想对函数的某个参数设置默认值,可以将 NULL
赋值给该参数。
惰性求值(延后计算)
R函数的参数的计算遵循惰性原则,只在需要时进行计算。
f <- function(a, b) {
a^2
}
f(2)
## [1] 4
该函数实际没有调用参数 b
,因此调用 f(2)
不会报错,根据位置匹配,将2赋值给2 a
。
f <- function(a, b) {
print(a)
print(b)
}
f(45)
## [1] 45
## Error: argument "b" is missing, with no default
函数首先打印了“45”,然后报错,因为在执行 print(a)
时,参数 b
未调用。执行 print(b)
时程序报错
“...” 参数
... 参数用来传递数目不确定的参数给其他函数。
- ... 常被用来扩展一个函数,避免原函数的所有参数列表再次声明
myplot <- function(x, y, type = "l", ...) {
plot(x, y, type = type, ...)
}
- 一般函数使用 ... 传递额外的参数给方法(Method)
> mean
function (x, ...)
UseMethod("mean")
如果无法提前知道需要传递给函数的参数数目,需要使用“...”参数。
> args(paste)
function (..., sep = " ", collapse = NULL)
> args(cat)
function (..., file = "", sep = " ", fill = FALSE,
labels = NULL, append = FALSE)
“...” 参数后的参数
“...” 参数后的参数必须通过名称精确匹配,不能局部匹配。
> args(paste)
function (..., sep = " ", collapse = NULL)
> paste("a", "b", sep = ":")
[1] "a:b"
> paste("a", "b", se = ":")
[1] "a b :"
课程分享
生信技能树全球公益巡讲
(https://mp.weixin.qq.com/s/E9ykuIbc-2Ja9HOY0bn_6g)
B站公益74小时生信工程师教学视频合辑
(https://mp.weixin.qq.com/s/IyFK7l_WBAiUgqQi8O7Hxw)
招学徒:
(https://mp.weixin.qq.com/s/KgbilzXnFjbKKunuw7NVfw)
网友评论