gpt4 book ai didi

r - 为什么 Map 只需要一组向量作为参数,而 mapply 需要这两个参数和 MoreArgs 参数?

转载 作者:行者123 更新时间:2023-12-02 16:18:31 27 4
gpt4 key购买 nike

据我所知,除了简化之外,mapply 可以完成的所有事情都可以用Map 完成。毕竟,Mapmapply 的包装器。然而,我很惊讶地看到 mapply 接受了两个 ... 参数集(文档称之为“arguments to vectorize over (vectors or lists of严格正长度,或全部为零长度)")和一个位于所需函数 f 之上的 MoreArgs 参数,而 Map 不使用 MoreArgs,只需要 ...(文档称之为“vectors”)和 f.

我的问题是:为什么 mapply 需要 MoreArgsMap 不需要? mapply 可以做一些 Map 做不到的事情吗?还是 mapply 试图使使用 Map 会更难的事情变得更容易?如果是,是什么?

我怀疑 sapply 可能是一个有用的答案引用点。将其 XFUN... 参数与 mapply 进行比较可能会有所帮助...MoreArgs

最佳答案

让我们看一下Map的代码:

Map
function (f, ...)
{
f <- match.fun(f)
mapply(FUN = f, ..., SIMPLIFY = FALSE)
}

如你所写,它只是一个包装器,点被转发给mapply,注意SIMPLIFY被硬编码为FALSE

Why does mapply need MoreArgs but Map doesn't?

这是一个设计选择,可能部分是由于历史原因,我不会介意显式的 MoreArgsUSE.NAMES 参数(或 SIMPLIFY = TRUE 论点),但我相信基本原理是 Map 是为了简单,如果你想调整参数,我们鼓励你使用 mapply。不过,您可以将 MoreArgsUSE.NAMESMap 一起使用,它们将通过点传送到 mapply调用,尽管它没有记录,因为文档将 ... 参数描述为“向量”。

Map(sum, setNames(1:2, c("a", "b")), 1:2)
#> $a
#> [1] 2
#>
#> $b
#> [1] 4

Map(sum, setNames(1:2, c("a", "b")), 1:2, USE.NAMES = FALSE)
#> [[1]]
#> [1] 2
#>
#> [[2]]
#> [1] 4

Map(
replicate,
2:3,
c(FALSE, TRUE),
MoreArgs = list(expr = quote(runif(1))))
#> [[1]]
#> [[1]][[1]]
#> [1] 0.7523955
#>
#> [[1]][[2]]
#> [1] 0.4922519
#>
#>
#> [[2]]
#> [1] 0.81626690 0.07415023 0.56264388

等效的 mapply 调用是:

mapply(sum, setNames(1:2, c("a", "b")), 1:2, SIMPLIFY = FALSE)
#> $a
#> [1] 2
#>
#> $b
#> [1] 4

mapply(sum, setNames(1:2, c("a", "b")), 1:2, USE.NAMES = FALSE, SIMPLIFY = FALSE)
#> [[1]]
#> [1] 2
#>
#> [[2]]
#> [1] 4

mapply(
replicate,
2:3,
c(FALSE, TRUE),
MoreArgs = list(expr = quote(runif(1))))
#> [[1]]
#> [[1]][[1]]
#> [1] 0.6690229
#>
#> [[1]][[2]]
#> [1] 0.7529774
#>
#>
#> [[2]]
#> [1] 0.8632736 0.7822639 0.8553680

Can mapply do something that Map cannot? Or is mapply trying to make something easier that would be harder with Map? And if so, what?

您不能将 SIMPLIFYMap 一起使用:

Map(sum, 1:3, 1:3, SIMPLIFY = TRUE)
#> Error in mapply(FUN = f, ..., SIMPLIFY = FALSE): formal argument "SIMPLIFY" matched by multiple actual arguments

一些历史

  • mapply 是在 R 1.7.0 中引入的
  • Map 是在 R 2.6 中引入的,NEWS 条目如下:

New higher-order functions Reduce(), Filter() and Map().

f 参数名称在这些函数之间共享,并且它们记录在同一页上。我不知道为什么放弃命名函数 FUN 的原因,但这 3 个函数(以及 ?Reduce 中记录的其他函数)之间的一致性解释了为什么 mapplyMap 不会以相同的方式命名它们的函数参数(我猜一致性也解释了大写的 M)。

在文档中我们还可以阅读:

Map is a simple wrapper to mapply which does not attempt to simplify the result, similar to Common Lisp's mapcar (with arguments being recycled, however). Future versions may allow some control of the result type.

因此,理论上,正如我从上一句中了解到的,Map 可以升级以提供某种类型稳定性,类似于 vapply 所做的。在我看来,R-devel 并没有一路走下去,因为他们想花时间来适本地决定要做什么,从那时起他们就把它留在了这个状态。

关于r - 为什么 Map 只需要一组向量作为参数,而 mapply 需要这两个参数和 MoreArgs 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66104123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com