以下代码将过滤同位素组合表,以识别仅富含一种元素的组合。
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/