r - 如何在filter_at中使用.data?

标签 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))

我想将此代码包含在包中,并避免出现全局变量“.”不可见的绑定(bind)警告。当我将 filter_at 调用更改为

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

我收到以下错误,错误:(列表)对象无法强制输入“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 世界中是用于指代“当前数据帧”的代词。然后,您的过滤谓词会将整个数据帧与 0 进行比较,而不仅仅是感兴趣的列。这会导致您观察到的错误。

我建议不要尝试让该函数与 .data 一起使用,而是 tackling the original warning instead .

关于r - 如何在filter_at中使用.data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56140898/

相关文章:

r - 构建动态点列表以一次一行读取数据帧

r - 如何将参数传递给函数内的 dplyr 连接函数?

linux - 使用 tm : bug on linux? 在 R 函数中分配全局变量

r - 由数据框中的列名引起的 arima xreg 参数错误

r - 选择 R 中第一个值等于 "x"的组

r - Shiny:输出元素/图的动态数量

r - 在 dplyr 中有条件地改变数据

r - 选定的列到新行

r - R 中按组划分的因子水平百分比

r - 在 tidyeval 框架中避免越界