2

如果在调用函数之前我不想指定列,我将如何创建一个在列中删除 NA 值的函数?

minimal_case <- function(column_name = "a") {
  enquo_name <- enquo(column_name)

  example <- tibble(a = c(NA, 1))

  print(filter(example, !is.na(a)))

  print(filter(example, !is.na(rlang::UQ(enquo_name))))

}

第一个打印语句的输出是:

# A tibble: 1 x 1
      a
  <dbl>
1     1

第二个打印语句的输出是:

# A tibble: 2 x 1
      a
  <dbl>
1    NA
2     1

如何让第二个打印语句与第一个相匹配?

4

2 回答 2

3

似乎column_name参数是一个字符串。在这种情况下,您可以使用rlang::sym

minimal_case <- function(column_name = "a") {
    example <- tibble(a = c(NA, 1))

    print(filter(example, !is.na(a)))

    print(filter(example, !is.na(!!rlang::sym(column_name))))

}
于 2017-08-11T05:16:13.553 回答
1

关于如何在 dplyr 中执行此类操作的文章很好:http: //dplyr.tidyverse.org/articles/programming.html

这种情况的关键是您不必a在参数中引用。您也可以使用!!而不是UQ

minimal_case <- function(column_name = a) {
    enquo_name <- enquo(column_name)

    example <- tibble(a = c(NA, 1))

    print(filter(example, !is.na(a)))

    print(filter(example, !is.na(!!enquo_name)))

}
于 2017-08-11T05:16:26.470 回答