在管道中将 numeric(0) 更改为 NA,但 return 否则不变

Change numeric(0) to NA in pipe, but return unchanged otherwise

如果矢量为零长度(数字(0)),如何将矢量重新编码为 NA,但如果不是,return矢量不变?最好在 tidyverse 中使用管道。

我的尝试:

library(tidyverse)
empty_numeric <- numeric(0)
empty_numeric |> 
    if_else(length(.) > 0, true =  NA, false = . )
#> Error: `condition` must be a logical vector, not a double vector.

您不能在此处使用矢量化 if_else,因为它的输出与输入的长度相同(即始终是单个元素)。相反,您需要使用传统的 if。并且都不会与 built-in |> 管道一起使用,因为它限制了呼叫的形成方式(特别是,它只允许将 LHS 替换为 top-level 个参数,并且只有 一次 )。相比之下,我们需要重复LHS,并将其代入嵌套表达式。

然而,使用“magrittr”管道运算符是可行的:

myvec %>% {if (length(.) > 0L) . else NA}

或者,如果您更喜欢使用函数调用语法编写此代码:

myvec %>% `if`(length(.) > 0L, ., NA)

为了能够使用本地管道,我们需要将逻辑包装到一个函数中:

na_if_null = function (x) {
    if (length(x) == 0L) as(NA, class(x)) else x
}

myvec |> na_if_null()

(那里的 as 转换确保 return 类型与输入类型相同,而不管 x 的类型如何。)