当函数 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
我想像这样在数据集上使用 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