Ped*_*nte 3 functional-programming r tidyverse
rlang::invoke()
现在已软弃用,已 purrr::invoke()
退休。如今,以编程方式调用带有参数列表的函数的整洁方法是什么?
tldr; 使用exec
代替invoke
; 使用map2
加号exec
代替invoke_map
.
invoke
随着退休 invoke
set.seed(2020)
invoke(rnorm, list(mean = 1, sd = 2), n = 10)
#[1] 1.7539442 1.6030967 -1.1960463 -1.2608118 -4.5930686 2.4411470
#[7] 2.8782420 0.5412445 4.5182627 1.2347336
Run Code Online (Sandbox Code Playgroud)
和 exec
set.seed(2020)
exec(rnorm, n = 10, !!!list(mean = 1, sd = 2))
#[1] 1.7539442 1.6030967 -1.1960463 -1.2608118 -4.5930686 2.4411470
#[7] 2.8782420 0.5412445 4.5182627 1.2347336
Run Code Online (Sandbox Code Playgroud)
invoke_map
同样,而不是invoke_map
您使用map2
with exec
。以前,您会使用invoke_map
具有不同参数集的函数
set.seed(2020)
invoke_map(rnorm, list(list(mean = 0, sd = 1), list(mean = 1, sd = 1)), n = 10)
# [[1]]
# [1] 0.3769721 0.3015484 -1.0980232 -1.1304059 -2.7965343 0.7205735
# [7] 0.9391210 -0.2293777 1.7591313 0.1173668
#
# [[2]]
# [1] 0.1468772 1.9092592 2.1963730 0.6284161 0.8767398 2.8000431
# [7] 2.7039959 -2.0387646 -1.2889749 1.0583035
Run Code Online (Sandbox Code Playgroud)
现在,使用map2
与exec
set.seed(2020)
map2(
list(rnorm),
list(list(mean = 0, sd = 1), list(mean = 1, sd = 1)),
function(fn, args) exec(fn, n = 10, !!!args))
# [[1]]
# [1] 0.3769721 0.3015484 -1.0980232 -1.1304059 -2.7965343 0.7205735
# [7] 0.9391210 -0.2293777 1.7591313 0.1173668
#
# [[2]]
# [1] 0.1468772 1.9092592 2.1963730 0.6284161 0.8767398 2.8000431
# [7] 2.7039959 -2.0387646 -1.2889749 1.0583035
Run Code Online (Sandbox Code Playgroud)
遗憾的是,map2
plusexec
语法不如 简洁invoke_map
,但它可能更规范。
一些可能有助于避免使用map2
plus时出现问题的注释exec
:
map2
必须是 a list
。所以map2(list(rnorm), ...)
会起作用。只是提供map2(rnorm, ...)
不会的功能。这与 不同invoke_map
,后者接受list
函数的 a 和函数本身。list
参数list
s 的 a。map2
将遍历顶层list
,然后使用!!!
里面的大爆炸运算符exec
来强制拼接list
函数参数。