当函数 returns NULL 时防止 purrr::map 错误

Preventing purrr::map error when function returns NULL

我想像这样在数据集上使用 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_ 或其他一些值?

f定义为returnNA_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 return 连接 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 

[1] 索引是提取那些有实际值 'blah' return 的情况,这样我们 select 只有第一个元素,即 'blah' 而对于那些 if 条件是 TRUE 的人来说,它无论如何都会 return 只有 NA_character_

purrr::map_chr() 将尝试将列表输出转换为 character 向量,如果您尝试将 NULL 对象转换为字符,您会得到如下内容:

as.character(NULL)
#> character(0)

这是一个长度为 0 的向量。此外,NULL 不是此函数的有效对象类型。另一方面,这就是尝试将 NA_character_ 转换为 character..

时得到的结果
as.character(NA_character_)
#> NA

你可以试试这个:

library(purrr)

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

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

# naive map_chr
mytib %>% mutate(getf = map_chr(test, f))
## A tibble: 2 x 2
#  test  getf 
#  <chr> <chr>
#1 a     NA   
#2 b     blah