purrr::pmap输出命名规则探究:为何部分设置不生效?
[p]map调用输出名称的判定规则解析
我之前在Stack Overflow提问《Name output of pmap on tibble》,已得到解答,但后续测试发现仍未掌握内在逻辑。以下是测试代码及结果:
测试准备
先加载依赖包并定义参数表:
library(purrr) library(tibble) params <- tibble(nm = LETTERS[1:2], x = 1:2, y = 2:3, z = 1:2)
案例1:为nm设置名称后,输出获得预期名称
params %>% mutate(nm = set_names(nm)) %>% pmap(function(nm, x, y, ...) { x + y }) %>% names() # [1] "A" "B"
案例2:nm无需是函数第一个参数,输出仍能获得名称
params %>% mutate(nm = set_names(nm)) %>% pmap(function(x, y, nm, ...) { x + y }) %>% names() # [1] "A" "B"
案例3:为x设置名称,输出无名称
params %>% mutate(x = set_names(x, nm)) %>% pmap(function(x, y, nm, ...) { x + y }) %>% names() # NULL
案例4:为z设置名称,输出仍无名称(排除运算丢失名称的可能)
params %>% mutate(z = set_names(z, nm)) %>% pmap(function(x, y, nm, ...) { x + y }) %>% names() # NULL
案例5:去掉...参数,为z设置名称仍无效
params %>% mutate(z = set_names(z, nm)) %>% pmap(function(x, y, nm, z) { x + y }) %>% names() # NULL
案例6:nm设置名称后,即使函数未直接引用nm,输出仍能获得名称
params %>% mutate(nm = set_names(nm)) %>% pmap(function(x, y, ...) { x + y }) %>% names() # [1] "A" "B"
核心规则解析
[p]map系列函数的输出名称,是从输入的带名称的字符型原子向量列中提取的,关键规则如下:
- pmap处理数据框/ tibble时,会检查所有列,只要存在自身带有名称的字符型向量列,就会将该列的元素名称作为对应输出元素的名称。
- 这个列不需要被函数显式调用,也不限制它在参数列表中的位置。
- 非字符型的列(比如数值型)即使带有名称,也不会被用来命名输出。
对应到测试案例:
- 案例1、2、6中,
nm是带名称的字符型向量,符合条件,因此输出被自动命名。 - 案例3、4、5中,被设置名称的是数值型列,不符合要求,所以输出无名称。
内容的提问来源于stack exchange,提问作者thothal
相关产品推荐
相关产品推荐

