【问题标题】:Why can't -qnorm in sapply?为什么 -qnorm 不能在 sapply 中使用?
【发布时间】:2013-03-24 00:56:18
【问题描述】:
> sapply(c(0.05,0.01),function(k){-qnorm(k)})
[1] 1.644854 2.326348
> -sapply(c(0.05,0.01),qnorm)
[1] 1.644854 2.326348

但是下面的不能运行,为什么-qnorm不能在sapply中运行?

sapply(c(0.05,0.01),-qnorm)
-qnorm 中的错误:一元运算符的参数无效

【问题讨论】:

  • 因为-qnorm不是函数,也不是函数名。
  • - 在此上下文中是一元前缀函数,qnorm 是一个函数,但在该上下文中 -qnorm 不会导致解释器解析为 function(x) {-(qnorm(x))},而这会成功。
  • sapply 调用 match.function,将 "-qnorm" 作为搜索参数传递,正如 Marius 所说,-qnorm 不是函数名,所以它不会没找到。

标签: r


【解决方案1】:

Compose 适合这样的事情:

require(functional)
sapply(c(0.05,0.01), Compose(qnorm, `-`))
[1] 1.644854 2.326348

请注意,此处需要在 - 周围加上反引号。

【讨论】:

  • 我对@9​​87654324@不熟悉,Compose似乎很实用。但是,在这种情况下,这似乎有点矫枉过正;)
  • 这似乎有点矫枉过正,但(至少对我而言)它会产生更易读的表达式。
  • 有趣的是,自从阅读本文后,我发现了两个Compose 的应用程序。谢谢指出
  • 另外看Reduce,它是Compose的基础。同样有用,但针对不同的问题。
【解决方案2】:

问题的原因与-qnorm(.) 实际上是两个函数的组合有关。首先计算qnorm(.),然后计算negative

sapply 期待 single 函数。

当您使用sapply( <..>, -qnorm) 时,R 正在尝试计算 “减去函数 qnorm”,这对函数没有意义。
(只需输入-qnorm,您将得到同样的错误。)

-qnorm(k) 起作用的原因是因为R 正在计算qnorm(k) 以获得一个数字,然后取该数字的负数。

同样,sapply(<..>, qnorm) 给出一个向量。这就是为什么当你在它前面添加负号时,你会得到你想要的输出。

【讨论】:

  • 他的代码几乎与问题中的第二个命令完全相同......当然,解释是正确的。我认为问题的 cmets 已经涵盖了这一点。
  • ...我完全错过了。哎呀! (答案已编辑以反映)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2020-11-14
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多