• R语言封装函数


    R语言封装函数

    原帖见豆瓣:https://www.douban.com/note/279077707/

    一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分。

    1. 函数名称,即要编写的函数名称,这一名称就作为将来调用R函数的依据。
    2. 函数声明,函数名称 <- function, 即声明该对象的类型为函数。
    3. 函数参数,这里是输入的数据,函数参数是一个虚拟出来的一个对象。函数参数所等于的数据,就是在函数体内部将要处理的值,或者对应的数据类型。 函数体内部的程序语句进行数据处理,就是对参数的值进行处理 ,这种处理只在调用函数的时候才会发生。函数的参数可以有多种类型。R help的界面对每个函数,及其参数的意义及所需的数据类型都进行了说明。

    4.函数体

    运算过程

    R运算过程中,应该尽量减少循环的使用,特别是嵌套循环。R提供了 apply,replicate等一系列函数,来代替循环,应该尽量应用这些函数, 提高效率。 如果在R中实在太慢,那么核心部分只能依靠C或者Fortran 等语言编写,然后再用R调用这些编译好的模块,达到更高的效率。
    运算过程中,需要大量用到if等条件作为判别的标准。if和while都是需要数据TRUE/FALSE这样的逻辑类型变量,这就意味着,if内部,往往是对条件的判别,例如 is.na, is.matrix, is.numeric等等,或者对大小的比较,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。if后面,如果是1行,则花括号可以省略,否则就必须要将所有的语句都放在花括号中。这和循环是一致的。

    例子1
    ## if与条件判断
    fun.test <- function(a, b, method = "add"){
        if(method == "add") { ## 如果if或者for/while;
            res <- a + b ## 等后面的语句只有一行,则无需使用花括号。
    }
        if(method == "subtract"){
            res <- a - b
        }
        return(res) ## 返回值
    }
    ### 检验结果
    fun.test(a = 10, b = 8, method = "add")
    fun.test(a = 10, b = 8, method = "substract")
     
    for循环有些时候是必须要用到的,for循环内部,往往需要用下标,访问数据内的一定元素,例如向量内的元素,这时候用方括号表示。一维的数据组合,或者数组,常常称为向量。二维的数据组合,往往称为矩阵,或者数据框。具体的访问方式主要是方括号内部有没有逗号的区别。for循环或者while循环有时候让人觉得比较困惑,可能需要专门的时间进行讲解。

    例2
    ### for循环与算法
    test.sum <- function(x)
    {
        res <- 0 ### 设置初始值,在第一次循环的时候使用
        for(i in 1:length(x)){
            res <- res + x[i] ## 这部分是算法的核心,
    ##总是总右面开始计算,结果存到左边的对象
        }
        return(res)
    }
     

    ### 检验函数
    a <- c(1,2,1,6,1,8,9,8)
    test.sum(a)
    sum(a)

    对于 博客中ggplot2的代码

    可如下进行封装:

    fun1 <- function(data, xlab, ylab, xname, yname) {
      ggplot(data, aes(xlab, ylab)) + 
        geom_bar(aes(fill = xlab), stat = 'identity') + 
        labs(x = xname, y = yname) +
        geom_text(aes(label = ylab), hjust = 1.5, colour = 'white') +
        coord_flip() +
        theme_minimal() +
        theme(legend.position = 'none')
    }

    调用如下:

    data <- head(df_CJT_USA, 10)
    xname <- 'CurrentJobTitleSelect'
    yname <- 'Count'
    fun1(data, reorder(data$CurrentJobTitleSelect, data$Count), data$Count, xname, yname)
  • 相关阅读:
    匿名,排序,过滤,映射,递归函数
    内置函数图
    for(var i in items) 和 for(var i;i<items.length;i++) 区别
    js中var、let、const的区别 (待总结)
    eclipse拉取git项目 Read timed out after 30,000 ms
    eclispe git config配置文件配置远程仓库
    git pull出错:cannot pull into a repository with state: merging_resolved"
    HttpClient之用CloseableHttpClient发送post请求
    注意设置httpclient连接数
    This compilation unit is not on the build path of java project (此编译单元不在java项目的生成路径上)
  • 原文地址:https://www.cnblogs.com/Grayling/p/11190313.html
Copyright © 2020-2023  润新知