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

问题描述 投票:0回答:2

如何将

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
r higher-order-functions map-function
2个回答
7
投票

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

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

4
投票
x |> Map(function(n) n * 2, n = _) |> unlist()

原因是

Map
基本上就是
mapply

mapply 为 ... 的值调用 FUN(重新循环到最长的长度,除非任何长度为零,其中循环到零长度将返回 list()),后跟 MoreArgs 中给出的参数。 如果命名了 ... 或 MoreArgs,则调用中的参数将被命名

所以,你的函数有一个命名参数

n
,因此,你可以通过管道输入该参数。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.