首页 > 解决方案 > Dplyr 管道 - 如果是这样,继续,否则结束

问题描述

是否有一种可接受的方式来构建类似于以下内容的 dplyr 管道:

data %>% {if(!is.null(data)) %>% else STOP} %>% ... %>% ...

如果不为空,我希望管道继续data,否则我不希望进一步的管道完成。

标签: rdplyr

解决方案


你当然可以。

如果我们假设如果不满足某个条件,某些事情会失败(或做错事,例如

NULL %>%
  mutate(cyl2 = cyl+2)
# Error in UseMethod("mutate") : 
#   no applicable method for 'mutate' applied to an object of class "NULL"

然后我们可以插入

NULL %>%
  { stopifnot(!is.null(.)); .; } %>%
  mutate(cyl2 = cyl+2)
# Error in stopifnot(!is.null(.)) : !is.null(.) is not TRUE
#     x

(请注意,我们没有得到关于 . 的失败'mutate' applied to an object of class "NULL"。)事实上,如果你想稍微花哨一点,你可以使用 R-4 的新命名stopifnot条件:

NULL %>%
  { stopifnot("data is null!" = !is.null(.)); .; } %>%
  mutate(cyl2 = cyl+2)
# Error in stopifnot(`data is null!` = !is.null(.)) : data is null!

它适用于(不干扰)真实数据:

mtcars[1:2,] %>%
  { stopifnot(!is.null(.)); .; } %>%
  mutate(cyl2 = cyl+2)
#               mpg cyl disp  hp drat   wt qsec vs am gear carb cyl2
# Mazda RX4      21   6  160 110  3.9 2.62 16.5  0  1    4    4    8
# Mazda RX4 Wag  21   6  160 110  3.9 2.88 17.0  0  1    4    4    8

推荐阅读