首页 > 解决方案 > 当函数返回 NULL 时防止 purrr::map 错误

问题描述

我想在这样的数据集上使用 map_chr 函数

library(purrr)
library(dplyr)

f <- function(x) if(x == "a") NULL else "blah"
f("a") # returns NULL

# make tibble
mytib <- tibble(test = c("a", "b"))

# naive map_chr
mytib %>% mutate(getf = map_chr(test, f))

# with .default
mytib %>% mutate(getf = map_chr(test, f, .default = NA_character_))

如您所见, map_chr 失败并显示错误消息Error: Problem with `mutate()` input `getf`. x unused argument (.default = NA)

如其他地方描述的可能和 na_if 的尝试对我也不起作用。

如何让 map_chr 遍历参数并将 NULL 值保留为 NA_character_ 或其他值?

标签: rpurrr

解决方案


f定义返回可能会更好NA_character_

 f <- function(x) if(x == "a") NA_character_ else "blah"

然后OP的调用按预期工作

或者不是循环,而是创建一个矢量化函数

f <- function(x) case_when(x != 'a' ~ 'blah')

然后调用为

mytib %>% 
       mutate(getf = f(test))

或者另一个选项,如果f已经定义为 return NULL,则连接NA并提取第一个元素。 NULL没有任何length,所以只与NA返回连接NA

c(NULL, NA_character_)
#[1] NA

mytib %>% 
   mutate(getf = map_chr(test, ~ c(f(.x), NA_character_)[1]))
# A tibble: 2 x 2
#  test  getf 
#  <chr> <chr>
#1 a     <NA> 
#2 b     blah 

索引是提取那些有实际值 'blah' 返回的[1]情况,以便我们只选择第一个元素,即 'blah' 而对于那些if条件为 is的情况TRUE,无论如何它只会返回 NA_character_


推荐阅读