我想创建一个数字向量(在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
}
}
答案 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,那么除非你将它设置为以接近该长度的块创建它,否则这种方法的性能会很差。)