【问题标题】:R why does do.call not match a direct calculation?R为什么do.call不匹配直接计算?
【发布时间】:2018-07-17 03:23:26
【问题描述】:

在做一些更复杂的事情的过程中,我发现了以下内容: 如果我使用 do.call 将数值向量转换为列表,我会得到与应用函数不同的值,我不知道为什么。

x <- rnorm(30)
median(x) # -0.01192347

# does not match:
do.call("median",as.list(x))  # -1.912244

为什么?

注意:我正在尝试使用函数名称向量运行各种函数。这适用于 do.call,但前提是我从 do.call 获得正确的输出。

感谢您的任何建议。

【问题讨论】:

  • 我相信有人会解释为什么,但do.call(median,list(x = x)) 会返回您期望的值。
  • 啊,当然,as.list 正在将向量拆分为单个元素的列表,因此do.call() 只是抓取第一个元素传递给median
  • 谢谢!这有效并解释了问题所在。

标签: r do.call


【解决方案1】:

所以do.call 期望args 参数是参数列表,所以从技术上讲,我们希望传递list(x = x)

> set.seed(123)
> x <- rnorm(10)
> median(x)
[1] -0.07983455
> do.call(median,list(x = x))
[1] -0.07983455
> do.call(median,as.list(x))
[1] -0.5604756

在向量 x 上调用 as.list 会将其变成长度为 10 的列表,就像您要调用 median 并传递 10 个单独的参数一样。但实际上,我们只通过了一个,x。所以最后它只是抓取向量的第一个元素并将其传递给参数x

【讨论】:

  • 您还可以查看为什么您在使用 as.list(x) 版本时没有收到错误消息。如果我这样做:do.call(stats::median, as.list(x)) 我得到一个unused arguments 错误。您似乎使用了 median 的不同定义,它对其他 29 个参数做了其他事情,这种差异可能会在以后给您带来更多错误。
  • @Chris 有趣,我没有收到未使用的参数错误。我怀疑... 正在吞噬额外的值。
  • 啊,没关系,那是关于“你头发上的虫子”,可能只是版本差异。
  • 感谢您的解释。 :-)
猜你喜欢
  • 2016-11-28
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2012-08-24
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多