Как передать формулы или фразы в dplyr глаголах R в качестве аргументов

Я не могу использовать формулы или фразы в выражениях фильтра в dplyr.

a_table <- data_frame(key = rep(letters[1:2], each = 2), 
  value = replace(runif(4), mod(1:4, 2) == 1, NA))

a_cond <- quo(not(is.na(value)))

filter(a_table, !!a_cond)

Выдает ошибку

Error in filter_impl(.data, dots) : invalid argument type

Я прочитал виньетки по программированию NSE и dplyr и пробовал разные вызовы:

a_cond <- interp(~not(is.na(value_)), value_ = as.name("value"))

Но на самом деле не прибил это.
Спасибо за помощь.

Информация о сеансе:

> sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 17.10

other attached packages:
 [1] rlang_0.1.1       readxl_1.0.0      aws.s3_0.3.3      magrittr_1.5     
 [5] dplyr_0.5.0       ggplot2_2.2.1     tidyr_0.6.1       dtplyr_0.0.2     
 [9] lazyeval_0.2.0    purrr_0.2.2.2     data.table_1.10.4 feather_0.3.1    
[13] readr_1.1.0       lubridate_1.6.0   stringr_1.2.0  

2 ответа

Решение

Чтобы решить проблему с вопросами, мне пришлось обновить install_github вместо update.packages,

Это не решило проблему с формулами на основе lazyeval::interp(), хоть.

Чтобы это работало, я разобрался, как сделать эквивалент с помощью кавычек. Вместо

interp(~!is.na(value_), value_ = as.name("value"))

я сделал

quo(!is.na( !!sym("value") ))

И теперь все работает как надо.
Приветствия.

Мы можем использовать это expr

a_cond <- rlang::expr(magrittr::not(is.na(value)))
filter(a_table, !!a_cond)
# A tibble: 2 x 2
#  key   value
#   <chr> <dbl>
#1 a     0.225
#2 b     0.519

Или как quosure, но убедитесь, что функция not из magrittr

a_cond <- quo(magrittr::not(is.na(value)))
filter(a_table, !!a_cond)
# A tibble: 2 x 2
#   key   value
#  <chr> <dbl>
#1 a     0.225
#2 b     0.519
Другие вопросы по тегам