如何在 filter_at 中使用 .data?

How do I use .data in filter_at?

以下代码将过滤 table 同位素组合,以识别只有一种元素同位素富集的组合。

df <- tibble::tibble(
  C12 = rep(c(2:0), 2),
  C13 = rep(c(0:2), 2),
  H1 = rep(c(0, 1), each = 3),
  H2 = rep(c(1, 0), each = 3)
)

element_filter <- "H2"

dplyr::filter_at(df, dplyr::vars(element_filter), dplyr::all_vars(. == 0))

我想将此代码包含在一个包中并避免 no visible binding for global variable ‘.’ 警告。当我将 filter_at 调用更改为

dplyr::filter_at(df, dplyr::vars(element_filter), dplyr::all_vars(.data == 0))

我收到以下错误,Error: (list) object cannot be coerced to type 'double'。我在其他函数中成功地使用了 .data 代词,但我无法弄清楚如何让它在这里工作。感谢您的帮助。

虽然许多函数通常同时支持 ..data,但它们通常不能互换。具体来说,filter_at 调用了一个内部函数 apply_filter_syms。该函数又将 . 代词映射到正在查看的符号,如以下 source code 行所示:

pred <- map(syms, function(sym) expr_substitute(pred, quote(.), sym))

请注意,该函数中的任何地方都没有提及 .data。因为没有对 .data 进行特殊处理,所以它与任何其他变量一样被处理。 R 会遍历调用栈,直到找到 .data 的定义,在 dplyr 的世界里,它是用来指代 "the current data frame" 的代词。然后,您的过滤谓词会将整个数据框与 0 进行比较,而不仅仅是感兴趣的列。这会导致您观察到错误。

我建议 tackling the original warning instead.

而不是尝试让函数与 .data 一起工作