{assertr::assert} для подмножества фрейма данных в канале

#r #assertion

Вопрос:

Я хотел бы {assertr} assert на подмножестве фрейма данных. У меня есть обходной verify путь, но я получаю ошибку assert при передаче по трубопроводу. Есть ли способ получить assert подмножество фрейма данных с помощью конвейера? Смотрите reprex ниже. Спасибо вам за вашу помощь!

 library(dplyr)
library(assertr)

# For cars with 6 cyl, vs is NOT na
mtcars %>% 
  filter(cyl == 6) %>% 
  count(!is.na(vs))
#>   !is.na(vs) n
#> 1       TRUE 7

# Success: Verify that no rows with cyl 6 and vs na
mtcars %>% 
  assertr::verify(nrow(filter(., cyl == 6 amp; is.na(vs))) == 0) %>% 
  head()
#>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#> Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

# Success: Assert without piping
assertr::assert(filter(mtcars, cyl == 6), not_na, vs)
#>                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

# Error: Assert that vs NOT na when cyl 6
mtcars %>% 
  assertr::assert(filter(., cyl == 6), not_na, vs)
#> Error: Can't subset columns that don't exist.
#> x Column `not_na` doesn't exist.
 

Создано 2021-10-08 пакетом reprex (v2.0.0)

ПРАВКА: Я сделал ошибку выше — утверждение без конвейера не отвечает моим потребностям, так как вывод фильтруется…

 # Assert without piping runs but the output is filtered
assertr::assert(filter(mtcars, cyl == 6), not_na, vs)
#>                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

 

Комментарии:

1. Не проверено, но вам, вероятно, нужно заключить его в фигурные скобки, чтобы запретить поведение по умолчанию при размещении LHS трубы в качестве первого аргумента в RHS. mtcars %>% { assertr::assert(filter(., cyl == 6), not_na, vs) } .

2. Спасибо, Ричи. Это работает! Но вывод фильтруется, как и одно из моих «решений» выше, по ошибке. Так что это не отвечает моим потребностям. Я отредактировал вопрос, чтобы уточнить.