簡體   English   中英

在 mutate/case_when 中使用自定義矢量化 function 時出錯

[英]Error in using custom vectorized function in mutate/case_when

下面是重現錯誤的簡單代碼。 我定義了一個簡單的 function,使用purrr::map將其與另一個 function 向量化,然后嘗試在 mutate case_when 中使用它,其中條件通常應確保 arguments 有效。 錯誤發生在條件if(arg1 > 0) when arg1 = NA時,但我不明白為什么會發生這種情況。 如果我應用過濾器,錯誤就會消失。 有誰知道我做錯了什么? 我的感覺是它應該工作。

require(tidyverse)

f_single <- function(arg1, arg2) {
  if (arg1 > 0) {
    return(arg1 * arg2)
  }
}

f_vector <- function(arg1, arg2) {
  result <- map2_dbl(arg1, arg2, f_single)
  return(result)
}

x <- tribble(~ arg1, ~ arg2,
             NA, 1,
             2, 3,
             4, 5,)

x %>%
  # filter(!is.na(arg1)) %>%
  mutate(y = case_when(arg1 > 0 ~ f_vector(arg1, arg2)))

錯誤如下:

Error in `mutate()`:
! Problem while computing `y = case_when(arg1 > 0 ~ f_vector(arg1, arg2))`.
Caused by error in `if (arg1 > 0) ...`:
! missing value where TRUE/FALSE needed

兩個問題:

  1. NA傳遞給if語句將引發錯誤。 您可以通過使用isTRUE包裝條件來避免這種情況。
  2. 您的代碼仍會引發錯誤,因為當arg1缺失或 <= 0 時f_single返回NULL ,但map_*期望每個輸入都有一個返回值。

如下更改f_single將解決這兩個問題:

f_single <- function(arg1, arg2) {
  if (isTRUE(arg1 > 0)) {
    arg1 * arg2
  } else {
    NA_real_
  }
}

# rest of code unchanged from original

# # A tibble: 3 x 3
#    arg1  arg2     y
#   <dbl> <dbl> <dbl>
# 1    NA     1    NA
# 2     2     3     6
# 3     4     5    20

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM