如何在 dplyr 动词 R 中传递公式或 quosures 作为参数
How to pass formulas or quosures in dplyr verbs R as arguments
我无法在 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
我们可以使用它 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
为了解决问题,我不得不更新 install_github
而不是 update.packages
。
不过,这并没有解决基于 lazyeval::interp()
的公式的问题。
为了让它起作用,我想出了如何用 quosures 做等价物。而不是
interp(~!is.na(value_), value_ = as.name("value"))
我做到了
quo(!is.na( !!sym("value") ))
现在一切正常。
干杯。
我无法在 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
我们可以使用它 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
为了解决问题,我不得不更新 install_github
而不是 update.packages
。
不过,这并没有解决基于 lazyeval::interp()
的公式的问题。
为了让它起作用,我想出了如何用 quosures 做等价物。而不是
interp(~!is.na(value_), value_ = as.name("value"))
我做到了
quo(!is.na( !!sym("value") ))
现在一切正常。
干杯。