【问题标题】:How to pass formulas or quosures in dplyr verbs R as arguments如何将 dplyr 动词 R 中的公式或 quosures 作为参数传递
【发布时间】:2018-02-02 17:13:43
【问题描述】:

我无法在 dplyr 的过滤器表达式中使用公式或 quosures。

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  

【问题讨论】:

    标签: r dplyr lazy-evaluation nse lazyeval


    【解决方案1】:

    我们可以使用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
    

    【讨论】:

    • 奇怪。使用expr 我仍然收到object 'value' not found 的错误。随着quosure,它也说invalid argument type。我正在添加我的相关@​​987654330@ 作为编辑。
    • @Diego 你的 dplyr 版本是什么?我正在使用dplyr_0.7.4
    • 嗯...那就是dplyr_0.5.0。 @akrun。我会更新的。
    • @Diego 那将是旧版本,与 quosures 不兼容
    • 这是有道理的。 quo!! 这次为我做了。不再需要interp
    【解决方案2】:

    为了解决 quosures 问题,我必须使用 install_github 而不是 update.packages 进行更新。

    不过,这并没有解决基于 lazyeval::interp() 的公式的问题。

    为此,我想出了如何使用 quosures 来制作等价物。而不是

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

    我做到了

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

    现在一切正常。
    干杯。

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2019-09-17
      • 2019-02-06
      相关资源
      最近更新 更多