我对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循环的页面和页面,但是无法真正弄清楚如何解决这些(和其他)问题。登记/> 我再说一遍,我很新,所以我在努力去理解它。任何帮助将不胜感激。
答案 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的负面索引的教育优势。在文档中查找“参数回收”。较短的对象是自动复制/三次复制的,但是很多需要用于完全匹配数学或逻辑表达式中最长向量的长度。