R - 模运算后加法

问题描述 投票:0回答:2

运行代码片段

D=1;for (j in 1:5){D=(D-1)%%4;print(D)}
我得到了预期的结果:

[1] 0
[1] 3
[1] 2
[1] 1
[1] 0

但是当我将结果加 1

D=1;for (j in 1:5){D=((D-1)%%4)+1;print(D)}
时,它会变成:

[1] 1
[1] 1
[1] 1
[1] 1
[1] 1

为什么会出现这种情况?

这就是我所期望的:

D=1;for (j in 1:5){D=(D-1)%%4;print(D+1)}
[1] 1
[1] 4
[1] 3
[1] 2
[1] 1
r modulo arithmetic-expressions
2个回答
1
投票

您将

D
初始化为 1。当
j
为 0 及更高版本时,您可以计算

D=((D-1)%%4)+1
  • D-1 是 1-1,也就是 0
  • 0%%4 是 0
  • 0 + 1 等于 1

因此,当

D
为 1 时,则上述公式将得出 1,与 j 的值无关,因为
D
仅取决于其自身先前的值,并且每当它为 1 时,公式将得出 1,因此
D
将从不改变。相反,尝试这个公式:

D=(D%%4)+1
  • 如果
    D
    为 0,则结果将为 1
  • 如果
    D
    为 1,则结果将为 2
  • 如果
    D
    为 2,则结果将为 3
  • 如果
    D
    为 3,则结果将为 4
  • 如果
    D
    为 4,则结果将为 1
  • 等等
  • 等等

既然你想要

[1] 1
[1] 4
[1] 3
[1] 2
[1] 1

您需要将

D
初始化为 0,因此第一个结果将为 1:

D=0;for (j in 1:5){D=(D%%4)+1;print(D)}

0
投票

它每次都会返回 1,因为你正在做的是: D = 1

在你的循环中:

j = 1 :

D = ((D - 1) %% 4 ) + 1
D = ((1 - 1) %% 4 ) + 1
等于 0 %% 4 + 1 = 1

因此,在执行结束时,您将获得与开始时相同的 D 值,并且您会执行其他 4 次。

所以你的 D 值不会改变。

(英语不是我的母语,但如果您需要更多详细信息,我很乐意为您提供更多信息)

© www.soinside.com 2019 - 2024. All rights reserved.