为什么 `a` 和 `b` 不使用 R 中的 `mapply` 生成同一组数字?

Why `a` and `b` don't generate the same set of numbers using `mapply` in R?

我想知道为什么 ab 不生成以下相同的一组数字:

N = 60 ; df = N-1 ; d = 3 ; ncp = d*sqrt(N)

a = mapply(c, as.list(14: d*sqrt(N)+5), as.list(-14: -d*sqrt(N)+5), SIMPLIFY = FALSE) 

b = mapply(c, as.list(14: ncp+5), as.list(-14: -ncp+5), SIMPLIFY = FALSE)

换句话说,我问的是为什么 as.list(-14: -d*sqrt(N)+5)as.list(-14: -ncp+5) 的读法不同,而 ncp = d*sqrt(N)?

它们不会生成相同的数字,因为它们因运算顺序不同而不同。让我们看看组件:

a 你有:

as.list(-14: -d*sqrt(N)+5)

而在 b 你有:

as.list(-14: -ncp+5)

这些不一样。让我们看看:

identical(as.list(-14: -ncp+5), as.list(-14: -d*sqrt(N)+5))
[1] FALSE

将此视为对操作顺序(优先级)的混淆。

您认为 : 右侧的所有内容在这两种情况下的计算结果相同。因此,您认为在这两种情况下,冒号的右侧都是 -18.2379。但不是!

他们没有在学校教你 : 如何影响评估。事实上,

-d*sqrt(N)+5 未计算为 -ncp+5。被评估为:

(14:-d*sqrt(N))+5

或者,等价地:

(14:-d)*sqrt(N)+5

同样,等价于:

(14:-d)*(sqrt(N)+5)

你看出区别了吗? : 排在第一位。 +514:-d 之后的其他操作在 -d*sqrt(N) 之后。它被添加到来自 : 的序列中。

证明:

identical((14:-d)*sqrt(N)+5, 14:-d*sqrt(N)+5)
[1] TRUE
identical((14:-d*sqrt(N))+5, 14:-d*sqrt(N)+5)
[1] TRUE

这其实是个很好的问题。当你学习运算顺序时,他们不会在学校教 :

隐藏在这里是一个优先级问题。 : 的优先级高于 *:

> 1:2*3
[1] 3 6
> 1:6
[1] 1 2 3 4 5 6