美文网首页
80.关于循环迭代

80.关于循环迭代

作者: 心惊梦醒 | 来源:发表于2021-10-29 17:48 被阅读0次

    【上一篇:79.关于Augmented vectors】
    【下一篇:81.关于Base R中的for循环】

        减少代码重复的三个优点:
        1. 更容易看出代码的意图:因为人们总是最关注到不同的点,而不是千篇一律的地方
        2. 更容易响应修改的需求:当需要修改代码时,你只需修改一个地方即可,而不是你复制-粘贴的所有地方
        3. 减少Bugs数:因为一行代码可以在多处使用。

        减少代码重复的两个工具:1)function:提取重复模式的代码并将其独立存放,便于重复使用和更新;2)iteration:当需要对多个输入做相同的事情时,比如在不同的列不同的数据集上重复相同的操作。

        两个重要的iteration范例:1)imperative programing(命令行式编程)for循环和while循环工具,好处是可以从代码中很明显地看到什么正在发生,缺点是语句略显啰嗦,对每个for loop,都有一些bookkeeping式的重复代码,可对学习iteration不失为一个很好的开始;2)functional programing(FP):提供一种工具,可以将重复代码提取出来,这样每一种共同的for loop都可以有自己的函数。

        比如:你编写了一个Mean函数用来求一个向量的平均值,你的需求是求一个data frame中每一列的平均值。不使用for循环的时候你是这样写的:

    # 自定义函数
    Mean <- function(x){
        mean_value <- sum(x,na.rm=T)/length(x)
        return(mean_value)
    }
    # 输入数据
    df <- data.frame(
        a=rnorm(10),
        b=rnorm(10),
        c=rnorm(10),
        d=rnorm(10)
    )
    # 求df中每一列的平均值(不用for循环)
    Mean(df$a)
    Mean(df$b)
    Mean(df$c)
    Mean(df$d)
    
    # 求df中每一列的平均值(使用for循环)
    output <- vector("double",length=length(df))
    for(i in seq_along(df)){
        output[[i]] <- Mean(df[[i]])
    }
    output
    
    # 如果是不同的数据集,你可以将上一步中的for循环搞成一个函数
    df_mean <- function(df){
        output <- vector("double",length=length(df))
        for(i in seq_along(df)){
            output[[i]] <- Mean(df[[i]])
        }
        return(output)
    }
    
    df1 <- df
    df2 <- df
    # 对每个数据集,求每列的平均值
    for(j in c(df,df1,df2)){
        result <- df_mean(j)
        print(result)
    }
    

    vector()和seq_along()函数

        vector()函数产生一个给定长度mode的向量(向量当然包括atomic vector和List啦!)。

    # 参数说明
    vector(mode = "logical", length = 0)
    mode:字符串,atomic vector mode或list、expression。
    length:非负值(可以是0)指定期望的长度,如果length>.Machine$integer.max(2147483647)时,mode必须是"double"
    
    atomic vector mode包括:"logical", "integer", "numeric" (synonym "double"), "complex", "character" 和"raw"。
    
    对mode=logical,vector元素初始化为FALSE
    对mode=numeric,vector元素初始化为0
    对mode=character,vector元素初始化为""
    对mode=raw,vector元素初始化为nul bytes
    对mode=list/expression,vector元素初始化为NULL
    
    

        seq_along()函数从给定参数的长度中生成一个integer vector(除非长度>.Machine$integer.max)

    seq_along(along.with)
    along.with可以是atomic vector,list,data frame等
    
    > seq_along(df)
    [1] 1 2 3 4
    
    

        seq_along(df)比1:length(df)好,因为当df的长度为0时,seq_along()可以得到正确的结果:integer(0),而1:length(f)的结果是1:0。用seq_along()可以避免不经意间使用长度为0的对象导致的错误。

    【上一篇:79.关于Augmented vectors】
    【下一篇:81.关于Base R中的for循环】

    相关文章

      网友评论

          本文标题:80.关于循环迭代

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