【问题标题】:Filter argument in function that defaults to make dplyr::filter() filter nothing函数中的过滤器参数默认使 dplyr::filter() 不过滤任何内容
【发布时间】:2018-08-24 09:50:32
【问题描述】:

我正在构建一个导入 Excel 电子表格的函数。

我希望该函数包含一个参数,该参数包含用户有兴趣查看的变量名称。参数中的值在函数内部的 dplyr::filter() 中使用。我希望参数的默认值包含所有内容(即不过滤掉任何内容)。

库和数据:

library(tidyverse)
data("iris")

没有任何默认过滤器值的过滤器功能(有效):

FILTER <- function(data = iris,
                   Filter_Values) {
  data %>%
    filter(Species %in% Filter_Values)
}
FILTER(Filter_Values = c("setosa", "virginica"))

如上所述,我希望 Filter_Values 参数默认为不过滤任何内容。
这可行,但当然不是一般的:

FILTER <-
  function(data = iris,
           Filter_Values = c("setosa", "versicolor", "virginica")) {
    data %>%
      filter(Species %in% Filter_Values)
  }

FILTER()

你能帮我找到一个通用的术语吗?我尝试过(但失败了):

 Filter_Values = TRUE  
 Filter_Values = c(TRUE)   
 Filter_Values = regex(".*")
 Filter_Values = everything()

任何帮助表示赞赏,
谢谢

【问题讨论】:

  • 也许filter_iffilter_at 可以提供帮助?你试过了吗?
  • Filter_values = data$Species ?
  • 您可以将Filter_Values 的默认值设置为NA,并在函数开头进行测试,将Filter_Values 替换为过滤列的所有值。您可能还希望有一个参数来明确过滤列是哪一列(这里是species)。

标签: r function dplyr


【解决方案1】:

也许:

FILTER <- function(data = iris,Filter_Values = NULL) {
    if (missing(Filter_Values)) data
    else data %>% filter(Species %in% Filter_Values)
}

FILTER()

【讨论】:

  • 谢谢。 @Shinobi_Atobe 解决方案同样适用于上述示例,但此解决方案在我的“真实”函数中效果更好,因为需要在该函数中过滤的数据框首先在函数内部创建。有了这个解决方案,我可以在函数的最后应用过滤函数。再次感谢。
【解决方案2】:

这个怎么样?

FILTER <-
  function(data = iris,
           Filter_Values = unique(data$Species)) {
    data %>%
      filter(Species %in% Filter_Values)
  }

FILTER()

【讨论】:

  • 谢谢你,但这对我来说不太管用。我看到我的可重现示例还不够好。使用 excel 文件的路径而不是数据调用真正的函数。因此,需要过滤的数据框首先在函数中创建。
  • str_extract(data$Species, ".*") 呢?
猜你喜欢
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2021-11-30
  • 2021-03-22
  • 2011-02-04
相关资源
最近更新 更多