将最后一个重复循环的结果作为R

时间:2015-11-19 13:17:24

标签: r

我想创建一个数字向量(在weibulldistribution(shape = c,scale = b)之后,在创建这个向量的开始时长度是不确定的(长度取决于g)!使用函数(c,b, g)使用重复循环将结果显示在屏幕上,但不会导入矢量。所以我需要最后一个循环的结果在矢量中,但不知道如何

t<-NULL
z<-NULL
p<-NULL
neededvector<-function(c,b,g) {
    p<-repeat{
        t<-rweibull(1,c,b)
        append(z,t)
        z<-print(append(z,t))
        if(sum(((z*0.01)^2*pi)/4)>g)
            break
    }
}

1 个答案:

答案 0 :(得分:4)

通常情况下,在循环中生成一个对象是一个坏主意,因为在R中它很慢。如果我们知道你的结果向量小于1000,我们可以使用cumsum来知道何时应该停止它:< / p>

neededvector <- function(c,b,g) {
    z <- rweibull(1000, c, b)
    z[((cumsum(z) * 0.01) ^ 2 * pi) <= g]
}

如果生成的向量应该长于1000,那么此解决方案将不适用于您。但是您可以通过以块为单位使其工作,并且比一次一个快得多。 / p>

neededvector <- function(c,b,g) {
  z <- c()
  while (TRUE) {
    # generate values 1000 at a time
    z <- c(z, rweibull(1000, c, b))
    threshold <- ((cumsum(z) * 0.01) ^ 2 * pi) <= g
    # check if this would include all elements of z.
    # if not, return it.
    if (sum(threshold) < length(z)) {
      return(z[threshold])
    }
  }
}

通常,而不是1000,将该值设置为比您通常期望的Weibull更长的某个长度。 (如果你的向量最终长度为100,000,那么除非你将它设置为以接近该长度的块创建它,否则这种方法的性能会很差。)