【问题标题】:Why `a` and `b` don't generate the same set of numbers using `mapply` in R?为什么`a`和`b`不使用R中的`mapply`生成相同的数字集?
【发布时间】:2017-07-21 03:44:42
【问题描述】:

我想知道为什么 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)

【问题讨论】:

  • 提示:这些序列的评估结果是什么?
  • 这是:*的优先级。比较这些:1:2*31:6

标签: r function loops vector mapply


【解决方案1】:

它们不会生成相同的数字,因为它们的操作顺序不同。让我们看一下组件:

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

这实际上是一个非常好的问题。当您学习操作顺序时,他们不会在学校教:

【讨论】:

  • @Reza 我会看看我是否可以更清楚,一会儿。希望这至少表明这不是关于mapply 或其他部分的问题,而是关于这两个内部组件的问题。
  • @Reza 我现在知道怎么解释了,1 秒
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 2014-03-29
    • 1970-01-01
    • 2021-10-06
    • 2011-12-23
    • 2019-04-30
    • 2021-07-11
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多