R:for循环嵌套

R:for循环嵌套,r,for-loop,nested,nested-loops,R,For Loop,Nested,Nested Loops,我刚刚开始使用R,在构造嵌套FOR循环时得到了一个意外的结果。当我运行下面的示例时,我希望它生成一个40000 x 1的向量(即,从t1=50开始,然后从0到1迭代t2,然后t1=51,然后从0到1迭代t2),但我得到的是一个200x1的向量 我为这个极其基本的问题道歉。我刚刚开始学习R,在我的搜索中找不到直接的解释 t1=seq(50, 150, 0.5) # 200x1 vector t2=seq(0, 1, 0.005) # 200x1 vector for (i in t1){

我刚刚开始使用R,在构造嵌套FOR循环时得到了一个意外的结果。当我运行下面的示例时,我希望它生成一个40000 x 1的向量(即,从t1=50开始,然后从0到1迭代t2,然后t1=51,然后从0到1迭代t2),但我得到的是一个200x1的向量

我为这个极其基本的问题道歉。我刚刚开始学习R,在我的搜索中找不到直接的解释

t1=seq(50, 150, 0.5) # 200x1 vector
t2=seq(0, 1, 0.005)  # 200x1 vector
   for (i in t1){

   for (j in t2){

   t3=3*t1+t2
 }
 }

也许是这样的:

t1 <- seq(50, 150, 0.5) # 200x1 vector
t2 <- seq(0, 1, 0.005)  # 200x1 vector
t3 <- vector(mode="numeric", length=length(t1)*length(t2))
k <- 0
for (i in t1) {
   for (j in t2) {
       t3[k]=3*i+j
       k <- k+1
   }
}

t1您可以在不使用循环的情况下使用


g类似于约翰·科尔曼的回答,
outer()
是一个很好的函数,用于处理类似的事情

## if you want 3 * (t1 +t2)
t3a <- as.vector(outer(t1, t2, `+`)) * 3

g <- expand.grid(t1,t2)
t3b <- 3 * (g[,1] + g[,2])

outer()
似乎要快一点,即使是在这个小例子上,大概是因为它在矩阵上工作,而
expand.grid()
必须形成一个数据帧。

我一点也不知道R,我希望结果是200x1,可能是你想要这样的
t3[(I-1)*length(t1)+j]循环的主体根本不使用索引
i
j
,因此不清楚您试图做什么,尽管逐个元素构建40000个元素向量是一个非常糟糕的主意。您在每次迭代中都写得太多了
t3
。您需要定义足够大的东西来容纳所有迭代。但是,您甚至没有进行迭代,因为您没有在任何地方使用
i
j
。您只是多次计算
3*t1+t2
。顺便说一句,
t1
t2
向量具有
201
元素,而不是
200
。这仍然在循环,它只是隐藏在
apply()
调用中。使用
g
然后执行
t3会更快
## if you want 3 * (t1 +t2)
t3a <- as.vector(outer(t1, t2, `+`)) * 3

g <- expand.grid(t1,t2)
t3b <- 3 * (g[,1] + g[,2])
## if you want 3 * (t1 +t2)
t4a <- as.vector(outer(3*t1, t2, `+`))

g <- expand.grid(t1,t2)
t4b <- 3 * g[,1] + g[,2]
> all.equal(t3a, t3b)
[1] TRUE
> all.equal(t4a, t4b)
[1] TRUE