如何解决为什么 Advanced R 会声称您不能提供与 Map 没有变化的参数?
Advanced R 的作者当然比我更了解 R。但是,Section 9.4.5 包含以下声明:
Map()
对所有参数进行向量化,因此您无法提供不变的参数。
但这显然是错误的。例如,我可以轻松编写以下内容:
> Map(function(x,y) x+y,1:3,runif(1))
[[1]]
[1] 1.224857
[[2]]
[1] 2.224857
[[3]]
[1] 3.224857
而且实际上,作者自己的purrr:map
函数中也有同样的功能:
purrr::map(1:3,function(x,runif(1))
[[1]]
[1] 1.729889
[[2]]
[1] 2.729889
[[3]]
[1] 3.729889
那么作者可能一直在谈论什么?我觉得我只是误读了,section 9.2.3 在 purrr::map
中展示了相同类型的功能这一事实强烈地强制执行了这种猜测:
plus <- function(x,y) x + y
x <- c(0,0)
map_dbl(x,plus,runif(1))
#> [1] 0.0625 0.0625 0.0625 0.0625
map_dbl(x,~ plus(.x,runif(1)))
#> [1] 0.903 0.132 0.629 0.945
那么上面的引用可能指的是 Map
中的什么缺陷?
解决方法
Map
是 mapply
的包装器:
Map <- function (f,...)
{
f <- match.fun(f)
mapply(FUN = f,...,SIMPLIFY = FALSE)
}
mapply
的文档告诉我们:
mapply
为 ... 的值调用 FUN
(重新循环到最长的长度,除非任何长度为零),后跟在 MoreArgs 中给出的参数。如果 ... 或 MoreArgs 被命名,则调用中的参数将被命名。
这意味着即使您提供了一个不应改变的参数,它也会作为一个向量被回收,而不是像标准函数参数那样保持原样。
如果非变化参数本身是一个向量,这会产生很大的不同:
f <- function(x,coef) {paste(coef[1],'*',x,'+',coef[2])}
Map(f,1:3,c(2,3))
[[1]]
[1] "2 * 1 + NA"
[[2]]
[1] "3 * 2 + NA"
[[3]]
[1] "2 * 3 + NA"
Warning message:
In mapply(FUN = f,SIMPLIFY = FALSE) :
longer argument is not a multiple of length of shorter
相反,purrr::map
允许参数不变,这两个示例之间的差异说明了上述引用的作者可能的意思:
purrr::map(1:3,f,3))
[[1]]
[1] "2 * 1 + 3"
[[2]]
[1] "2 * 2 + 3"
[[3]]
[1] "2 * 3 + 3"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。