将 Map 函数与基本 R 管道一起使用 |>

jua*_*asi 5 r higher-order-functions map-function

如何Map与管座一起使用该功能|>

下一个向量可以在函数x内部使用Map

x <- c(1,5,1,2)
Map(function(n)n*2, x) |> unlist()
# [1]  2 10  2  4
Run Code Online (Sandbox Code Playgroud)

这有效,但是当我尝试使用管道时,出现下一个错误:

x |> Map(function(n)n*2, ...= _)
#Error in (function (n)  : unused argument (... = dots[[1]][[1]])
Run Code Online (Sandbox Code Playgroud)

所以我又做了一个匿名函数,但是很难读

x |> (function(x) Map(function(n)n*2,x))() |> unlist()
#[1]  2 10  2  4
Run Code Online (Sandbox Code Playgroud)

我想知道为什么Map不能占据占位符 _

另一种解决方案

我改变了参数的顺序Map所以它可以更清晰

myMap <- \(...,f) Map(f, ...)
x |> myMap(f = function(n)n*2) |> unlist()
#[1]  2 10  2  4
Run Code Online (Sandbox Code Playgroud)

GKi*_*GKi 6

您可以尝试命名该函数,以便管道使用第一个空闲位置。

x |> Map(f=function(n)n*2) |> unlist()
#[1]  2 10  2  4
Run Code Online (Sandbox Code Playgroud)

但是Mapmapply典型用于多个参数,这里位置或给定的名称很重要。当前占位符_(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"
Run Code Online (Sandbox Code Playgroud)

如果函数使用名称,则需要使用相同的名称作为Mapor的参数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
Run Code Online (Sandbox Code Playgroud)