如何将
Map
功能与管座|>
配合使用?
下一个
x
向量可以在 Map
函数内部使用
x <- c(1,5,1,2)
Map(function(n)n*2, x) |> unlist()
# [1] 2 10 2 4
这可行,但是当我尝试使用管道时,我收到下一个错误:
x |> Map(function(n)n*2, ...= _)
#Error in (function (n) : unused argument (... = dots[[1]][[1]])
所以我又做了一个匿名函数,但是很难阅读
x |> (function(x) Map(function(n)n*2,x))() |> unlist()
#[1] 2 10 2 4
我想知道为什么
Map
不能拿占位符_
。
我改变了
Map
的参数顺序,这样它可以更清晰
myMap <- \(...,f) Map(f, ...)
x |> myMap(f = function(n)n*2) |> unlist()
#[1] 2 10 2 4
您可以尝试命名该函数,以便管道使用第一个空闲位置。
x <- c(1,5,1,2)
x |> Map(f=function(n)n*2) |> unlist()
#[1] 2 10 2 4
但是
Map
或 mapply
典型用于 多个 参数,这里位置或给定名称都很重要。占位符 _
当前(R 4.3.0)需要命名参数,也适用于只有 ...
的函数,但这里可以使用任何自由名称。
1:3 |> mapply(`paste`, 1, .=_)
#[1] "1 1" "1 2" "1 3"
1:3 |> mapply(`paste`, .=_, 1)
#[1] "1 1" "2 1" "3 1"
1:3 |> mapply(`paste`, x=_, 1)
#[1] "1 1" "2 1" "3 1"
如果函数使用名称,则需要使用相同的名称作为
Map
或 mapply
的参数。
1:3 |> Map(seq, 1, to=_)
#[[1]]
#[1] 1
#
#[[2]]
#[1] 1 2
#
#[[3]]
#[1] 1 2 3
1:3 |> Map(seq, 1, from=_)
#[[1]]
#[1] 1
#
#[[2]]
#[1] 2 1
#
#[[3]]
#[1] 3 2 1
c(1,5,1,2) |> Map(function(n) n*2, n=_) |> unlist()
#[1] 2 10 2 4
x |> Map(function(n) n * 2, n = _) |> unlist()
原因是
Map
基本上就是mapply
mapply 为 ... 的值调用 FUN(重新循环到最长的长度,除非任何长度为零,其中循环到零长度将返回 list()),后跟 MoreArgs 中给出的参数。 如果命名了 ... 或 MoreArgs,则调用中的参数将被命名。
所以,你的函数有一个命名参数
n
,因此,你可以通过管道输入该参数。