解释R中的循环

时间:2014-01-14 14:33:01

标签: r for-loop vector

我对R来说很新,而且对R编程更新。我有以下问题及其答案(不是我的)。我试图理解为什么有些价值,从它们获得的地方,为什么使用它们等等。

  

问题:使用for循环制作向量3 5 7 9 11 13 15 17。开始   使用x = numeric()并使用for循环

填充此向量

我知道我必须创建x = numeric()所以我可以用从循环中获得的结果填充它。

同学的回答是:

> x <- numeric()
> for(i in 1:8){   
      if(i==1){                ## Why ==1 and not 0, or any other value   
          x[i] <- 3              
      }else{   
          x[i] <- x[i-1]+2  ### And why i-1   
     }

我在类似的问题上遇到类似的问题:

  

创建一个for循环,将向量的第二个元素添加到第一个元素,   从结果中减去第三个元素,再次添加第四个元素   等等,用于矢量的整个长度

到目前为止,我创建了向量和空向量

> y = c(5, 10, 15, 20, 25, 30)
> answer <- 0 

然后,当我尝试执行for循环时,我陷入了困境:

for(i in 1:length(y)){
if(i...){ ### ==1? ==0?
    answer = y[i]   ###and here I really don't know how to continue. 
}else if()
}

相信我,当我告诉你我在这里阅读了几个问题的回复,比如在How to make a vector using a for loop中,加上关于for循环的页面和页面,但是无法真正弄清楚如何解决这些(和其他)问题。登记/> 我再说一遍,我很新,所以我在努力去理解它。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

首先,我将注释循环以回答循环正在做什么。

# Initialize the vector
x <- numeric()
for(i in 1:8){   
  # Initialize the first element of the vector, x[1].  Remember, R indexes start at 1, not 0.
  if(i==1){                
    x[i] <- 3              
  } else {   
    # Define each additional element in terms of the previous one (x[i - 1]
    # is the element of x before the current one.
    x[i] <- x[i-1]+2  ### And why i-1   
  }
} 

使用循环并增长它的更好的解决方案(如指令状态)是这样的:

x <- numeric()
for(i in 1:8){
  x[i] <- 2 * i + 1
}

这仍然不是一个很好的方法,因为在循环中生成一个向量非常慢。要解决此问题,您可以通过告诉numeric所需矢量的长度来预先分配矢量:

x <- numeric(8)

解决此问题的最佳方法是:

2 * 1:8 + 1

使用矢量化操作。

为了帮助您解决其他问题,我建议将循环的每个步骤写成表格。例如,对于我的解决方案,表格将是

i | x[i]
------------------
1 | 2 * 1 + 1 = 3
2 | 2 * 2 + 1 = 5

等等。这将让您了解for循环在每次迭代时所做的事情。

答案 1 :(得分:1)

这故意不是答案,因为有更好的方法来解决交替符号求和问题而不是for-loop。我认为对于for循环感到满意是有价值的,但是R中的矢量化方法也应该被学习。 R对其许多操作都有“参数回收”,包括“*”(乘法)操作:看看:

 (1:10)*c(1,-1)

然后取一个任意向量,说vec并尝试:

sum( vec*c(1,-1) )

查看该结果后,更正确的答案是:

vvec[1] + sum( vec[-1]*c(1,-1) )

这具有说明R的负面索引的教育优势。在文档中查找“参数回收”。较短的对象是自动复制/三次复制的,但是很多需要用于完全匹配数学或逻辑表达式中最长向量的长度。