【问题标题】:How do I use .data in filter_at?如何在 filter_at 中使用 .data?
【发布时间】:2019-05-15 02:10:58
【问题描述】:

以下代码将过滤同位素组合表,以识别只有一种元素富含同位素的组合。

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

【问题讨论】:

  • dplyr::filter_at(df, dplyr::vars(element_filter), dplyr::all_vars(. == 0)) 为我工作,没有任何警告。 R version 3.5.2
  • 同意发布的代码有效,但是当尝试更改为dplyr::filter_at(df, dplyr::vars(element_filter), dplyr::all_vars(.data == 0)) 时,它不起作用。这是为什么呢?
  • hmmm..我不确定,但可能是因为 all_vars 不期望 .data 参数? ?all_vars 表示它希望输入为 expr。虽然我在这里解释可能错了。
  • 您的示例只需 filter 即可完成。是否存在表格中包含两种以上不同化学元素的情况?此外,您是否只需要仅存在一种同位素富集的元素,还是仅存在一种同位素富集的元素?
  • 这两点都是。 expression_filter 是根据用户提供的分子式确定的,该分子式还可以包括 N、O、S 及其同位素以及指示哪些元素可标记的参数。

标签: r dplyr rlang tidyeval


【解决方案1】:

虽然许多函数通常同时支持..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

【讨论】:

  • 我一直想知道是不是这种情况,但不知道如何找到答案。谢谢!我喜欢我在其他地方看到的. &lt;- "Shut up" 解决方案...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多