R函数仅打印矢量的最后一个值

时间:2013-11-26 15:57:32

标签: r loops vector

感谢您对此功能的帮助,该功能应该:

  1. 输入特定值
  2. 将值插入函数
  3. 获取向量中生成的一组其他值
  4. 计算向量的每个元素的值
  5. 返回包含矢量和计算值的数据框。
  6. 以下是我的尝试:

    rate<-function(Y2) {
       ran<-seq(0.001,1,0.001)
       for(i in ran) {
         calculated<-as.vector(Y2/(1+i)+Y2/(1+i)^2+Y2/(1+i)^3+Y2/(1+i)^4)
         tableau<-data.frame(ran,calculated)
       }
       return(tableau)
    }
    

    使用res<-rate(500)进行测试时,只会返回1000次的最后一个值:

    ...
    
    ran calculated
    1   0.001   468.75
    2   0.002   468.75
    3   0.003   468.75
    ...
    
    996  0.996     468.75
    997  0.997     468.75
    998  0.998     468.75
    999  0.999     468.75
    1000 1.000     468.75
    

    我的循环有什么问题?

1 个答案:

答案 0 :(得分:1)

每次循环时,您都会将as.vector(...)计算的输出分配给同一个变量。然后你构建一个data.frame,每次循环时命名为tableau。你只返回最后一次迭代。如果你想保存每次迭代,你需要索引一些东西:

res[n] <- as.vector(...)

或者更多R-ish版本,使用其中一个申请系列(特别是lapply)并且根本没有循环:

rate <- function(Y2) {
    ran <- seq(0.001, 1, 0.001)
    result <- lapply(ran, 
                     function(i) data.frame(ran = i, 
                                            calculated = as.vector(Y2/(1+i)+Y2/(1+i)^2+Y2/(1+i)^3+Y2/(1+i)^4)))

    return (do.call(rbind, result))
}

话虽如此,没有理由循环或应用函数。使用R向量化的事实:

ran <- seq(0.001, 1, 0.001)
Y2 <- 500

calculated <- as.vector(Y2/(1+ran)+Y2/(1+ran)^2+Y2/(1+ran)^3+Y2/(1+ran)^4)

result <- data.frame(ran, calculated)

all.equal(result, rate(500))
# [1] TRUE