在管道中将 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
的类型如何。)
如果矢量为零长度(数字(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
的类型如何。)