Как передать формулы или фразы в 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