考虑以下玩具示例:
set.seed(10)
(n <- sample(5,size=1))
(d <- matrix(sample(1:100, size = n), ncol=1))
(g <- matrix(sample(1:10, size = n), ncol=1))
i <-1
while(d>g){
cat( "iteration" , i,"\n")
g <- g+1
i <- i + 1
}
g
Warning messages:
1: In while (d > g) { :
the condition has length > 1 and only the first element will be used
这里d
和g
都是列向量。 R
仅检查第一个元素。 g
的第一个元素大于或等于d
时,循环终止。但是我的目的是执行循环,直到g
的每个元素都大于或等于d
。如果我事先知道对象n
,则可以将while循环内的条件写为(d[1]>g[1] &d[2]>g[2] &d[3]>g[3])
。但是我事先不知道n
。我该怎么办?
答案 0 :(得分:1)
也许您需要any
:
set.seed(10)
(n <- sample(5,size=1))
# [1] 3
(d <- matrix(sample(1:100, size = n), ncol=1))
# [,1]
# [1,] 31
# [2,] 43
# [3,] 68
(g <- matrix(sample(1:10, size = n), ncol=1))
# [,1]
# [1,] 1
# [2,] 3
# [3,] 9
i <- 1
while (any(d>g)) { g <- g+1; i <- i+1; }
i
# [1] 60
g
# [,1]
# [1,] 60
# [2,] 62
# [3,] 68
不过,我认为尝试重复执行此操作是不必要的。
set.seed(10)
n <- sample(5,size=1)
d <- matrix(sample(1:100, size = n), ncol=1)
g <- matrix(sample(1:10, size = n), ncol=1)
(i <- max(d - g) + 1)
# [1] 60
g <- g + i - 1
g
# [,1]
# [1,] 60
# [2,] 62
# [3,] 68