现在 invoke() 已被软弃用,有什么替代方案?

Ped*_*nte 3 functional-programming r tidyverse

rlang::invoke()现在已软弃用,已 purrr::invoke()退休。如今,以编程方式调用带有参数列表的函数的整洁方法是什么?

Mau*_*ers 6

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您使用map2with 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)

现在,使用map2exec

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)

遗憾的是,map2plusexec语法不如 简洁invoke_map,但它可能更规范。

一些可能有助于避免使用map2plus时出现问题的注释exec

  1. 的第一个参数map2必须是 a list。所以map2(list(rnorm), ...)会起作用。只是提供map2(rnorm, ...)不会的功能。这与 不同invoke_map,后者接受list函数的 a 和函数本身。
  2. 第二个参数需要是list参数lists 的 a。map2将遍历顶层list,然后使用!!!里面的大爆炸运算符exec来强制拼接list函数参数。