在该代码实例中,purrr::map2_dbl如何识别自身参数?
关于
purrr::map2_dbl的参数匹配与代码运行逻辑 嘿,我来帮你把这个问题掰明白~首先先解决你的第一个疑惑:为什么这段代码没报错,然后再讲map2_dbl是怎么识别参数的。
为什么代码不会报错?
你看到的这段代码是在tibble里新增一列dist,用map2_dbl逐行计算a1和a2的结果。能正常运行的前提是:
- 你的
models数据框确实有a1和a2两列,而且都是等长的数值型向量; sim1_dist是一个接受两个数值参数、并且返回单个数值的函数——这刚好符合map2_dbl的要求(_dbl后缀就说明它会把函数的返回值整理成数值向量)。
只要满足这两个条件,这段代码就能顺利运行,不会报错。
map2_dbl是怎么识别参数的?
purrr包的map2系列函数(包括map2_dbl)的核心逻辑是并行遍历两个输入序列,它的参数规则是这样的:
map2_dbl(.x, .y, .f, ...)
.x:第一个要遍历的序列(这里就是models$a1).y:第二个要遍历的序列(这里就是models$a2).f:要应用的函数(这里是sim1_dist)
它的工作流程是:
- 从
.x(a1)里取第1个元素,同时从.y(a2)里取第1个元素; - 把这两个元素按位置顺序传给
.f(sim1_dist)——注意,是按位置匹配,不是按参数名匹配! - 计算出结果,作为新向量的第1个元素;
- 重复这个过程,直到遍历完所有行,最后把所有结果整合成一个数值向量,作为
dist列的值。
举个简单的例子,假设sim1_dist的定义是这样的:
sim1_dist <- function(first_num, second_num) { # 随便写一个需要两个参数的计算逻辑 abs(first_num) + abs(second_num) }
哪怕它的参数名和a1、a2完全不一样,map2_dbl依然会把a1的元素传给first_num,a2的元素传给second_num——因为它只看参数的位置,第一个输入对应函数的第一个参数,第二个输入对应函数的第二个参数。
再验证一下
我们可以模拟你的数据跑一遍:
library(tidyverse) # 模拟sim1_dist函数 sim1_dist <- function(x, y) { # 随便生成类似示例里的数值 round(runif(1, 10, 40), 1) } # 模拟models数据框 models <- tibble( a1 = c(-15.15, 30.06, 16.05), a2 = c(0.0889, -0.8274, 2.2695) ) # 运行你的代码 models <- models %>% mutate(dist = purrr::map2_dbl(a1, a2, sim1_dist)) models
运行后会得到类似你给出的tibble结果,完全不会报错。
内容的提问来源于stack exchange,提问作者Ovi
相关产品推荐
相关产品推荐

