以下代码将过滤一个同位素组合表,以识别仅一个同位素富集的组合。
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
代词,但无法弄清楚如何使其在这里工作。感谢帮助。
答案 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
一起使用。