美文网首页R语言知识干货R语言编程进阶
R语言与生信应用19-R语法-函数

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

作者: BioSi | 来源:发表于2019-05-06 22:46 被阅读119次

    函数

    通过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)
    
    • 命名参数在交互式命令行中使用较多,尤其是参数较多时。
    • 命名参数可以帮助记忆函数的参数名称,这在绘图中很有用。

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

    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, ...)
    }
    
    • 一般函数使用 ... 传递额外的参数给方法(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

    相关文章

      网友评论

        本文标题:R语言与生信应用19-R语法-函数

        本文链接:https://www.haomeiwen.com/subject/mogonqtx.html