如何在filter_at中使用.data?

时间:2019-05-15 02:10:58

标签: r dplyr rlang tidyeval

以下代码将过滤一个同位素组合表,以识别仅一个同位素富集的组合。

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代词,但无法弄清楚如何使其在这里工作。感谢帮助。

1 个答案:

答案 0 :(得分:2)

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

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

请注意,该函数中的任何地方都没有提到.data。由于没有.data的特殊处理,因此将其像其他任何变量一样对待。 R将遍历调用堆栈,直到找到.data的定义为止,在dplyr世界中,该定义是用来指代“当前数据帧”的代词。然后,您的过滤谓词会将整个数据框与0进行比较,而不仅仅是感兴趣的列。这会导致您观察到错误。

我建议不要使用tackling the original warning instead,而不是尝试使功能与.data一起使用。