在R中,需要帮助理解向量中的索引位置与因子中的值,特别是在循环上下文中

在R中,需要帮助理解向量中的索引位置与因子中的值,特别是在循环上下文中,r,indexing,R,Indexing,下面,我有两个相同代码的示例,但有一些细微的变化。第一个有效,第二个无效。我希望通过澄清第二种方法不起作用的原因,我能够准确地理解如何快速地将表达式解释为引用索引位置和这些位置中的值标题## 求所有小于1000且可被3或5整除的数字之和: ---版本A(此代码有效) x在版本B中,您不断将0添加到x,这会导致无限循环(至少当您在while和if中为添加大括号时是如此)。只有当您有合适的x时,版本B才会工作 我强烈建议写一篇论文,写出while循环每次迭代时发生的事情。这将帮助你了解发生了什么 对

下面,我有两个相同代码的示例,但有一些细微的变化。第一个有效,第二个无效。我希望通过澄清第二种方法不起作用的原因,我能够准确地理解如何快速地将表达式解释为引用索引位置和这些位置中的值标题##

求所有小于1000且可被3或5整除的数字之和:

---版本A(此代码有效)


x在版本B中,您不断将0添加到
x
,这会导致无限循环(至少当您在
while
if
中为
添加大括号时是如此)。只有当您有合适的
x
时,版本B才会工作

我强烈建议写一篇论文,写出while循环每次迭代时发生的事情。这将帮助你了解发生了什么

对于当前数据

i is 1
x[i] is x[1] is 0
x[1] %% 3 is 0 so x becomes c(0, x[1]) which is c(0, 0)
i becomes 2
然后,下一次迭代:

i is 2
x[i] is x[2] is 0
x[2] %% 3 is 0 so x becomes c(x, x[2]) which is c(0, 0, 0)
i becomes 3

等等。有比while循环(在R代码中很少见)更惯用的方法,但由于这是一个Project Euler问题,我将不进行描述。

首先,正如Andrie指出的,实现这一点的R方法是通过矢量化:

y <- 1:1e3
sum(y[y%%3==0 | y%%5==0])

y为什么要使用循环?一种更像R的方法是编写类似于
sum(x[x%%3==0 | x%%5==0])
的好问题。我不熟悉编程,也不熟悉R。这是一个陡峭的学习曲线,但我很享受学习,并愿意做繁重的工作。对于决定用什么方法解决问题的策略,有什么建议吗?谢谢你的快速回复。谢谢你关于写下发生了什么的建议。我已经开始这样做了,通常可以在R studio中测试我的假设,以了解循环的当前状态。
i is 2
x[i] is x[2] is 0
x[2] %% 3 is 0 so x becomes c(x, x[2]) which is c(0, 0, 0)
i becomes 3
y <- 1:1e3
sum(y[y%%3==0 | y%%5==0])
x <- 0 # x will be the vector of all number < 1000
y <- 0 # y will be your vector of all number < 1000 that are divisible by 3 or 5
i <- 1 # index that increases
while (x[i] < 1e3)  { # while the last element of x is less than 1000
  if (x[i] %% 3 == 0 | x[i] %% 5 == 0){  
    y <- c(y, x[i]) # this changes the numbers divisible by 3 or 5
  }
  x <- c(x, x[i]+1) # this adds the next element to x, so x[i+1] exists
  i <- i+1 # adds to i
}
sum(y)