我想实现以下for循环:
for (start in c(1,2,3,4,5,6,7,8,9,10)){
for (to in c(1,2,3,4,5,6,7,8,9,10)){
runif(100,start,to)
}
}
当然,只有当start
小于或等于to
有没有办法只运行这种情况的情况?
注意:这是一个简化的情况,请不要提供废除for循环的解决方案。
答案 0 :(得分:0)
为什么不:
for (start in c(1,2,3,4,5,6,7,8,9,10)){
for (to in c(1,2,3,4,5,6,7,8,9,10)){
if( start < to ){ runif(100,start,to)}
}
}
由于您没有打印或将结果分配给任何内容,所以不会发生太多事情,但至少您现在不会收到警告消息。
rnum<-numeric(0)
for (start in c(1,2,3,4,5,6,7,8,9,10)){
for (to in c(1,2,3,4,5,6,7,8,9,10)){
rnum <- c(rnum, if( start < to ){ runif(5,start,to)} )
}
}
str(rnum)
# num [1:225] 1.6 1 1.57 1.75 1.11 ...
sum(is.na(rnum))
#[1] 0
另一种方法是让内循环索引从大于start
的下一个整数开始(并跳过测试):
rnum<-numeric(0)
for (start in c(1,2,3,4,5,6,7,8,9)){
for (to in (start+1):10){
rnum <- c(rnum, runif(5,start,to) )
}
}
str(rnum)
sum(is.na(rnum))
答案 1 :(得分:0)
改变中间线:
if(to>start)runif(100,start,to)
答案 2 :(得分:0)
我仍然不明白你想做什么以及为什么你真的想要使用for
循环,但是:
for (start in c(1,2,3,4,5,6,7,8,9)){
for (to in ((start+1):10)){
runif(100,start,to)
}
}
答案 3 :(得分:0)
如果您的可能的起始值和结束值实际上相等(如您的示例中所示),则可以使用combn
:
#using a loop
start_to <- combn(1:10,2)
n <- 2
set.seed(42)
randoms <- sapply(as.data.frame(start_to), function(x) runif(n,
min=x[1], max=x[2]))
#without a loop
set.seed(42)
randoms2 <- matrix(runif(n*ncol(start_to),
min=rep(start_to[1,], each=n),
max=rep(start_to[2,], each=n)),
nrow=n)