R语言知识干货R语言编程进阶

R语言与生信应用19-R语法-函数

2019-05-06  本文已影响119人  BioSi

函数

通过function()可以自定义函数,函数的储存与其他的R对象相同,函数对象的类为 “function”。

f <- function(<参数>) {
        ## R语句
}

R函数也是R对象,可以向其他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)

函数参数可以部分匹配,有助于交互式操作。参数匹配的优先级的顺序如下:

  1. 检查命名参数的精确匹配Check for exact match for a named argument
  2. 检查局部匹配
  3. 检查位置匹配

定义函数

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, ...)
}
> 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

上一篇下一篇

猜你喜欢

热点阅读