如何在 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
一起工作
以下代码将过滤 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
一起工作