总结 我正在阅读一篇关于 dplyr 跨函数主题的文章。看第一个使用示例,看到了以前从未见过的运算符的使用。我不知道它们是否本质上与 dplyr 或其他一些包分开。无论哪种方式,我都不明白它们在代码中的使用。
代码示例:
starwars |>
summarize(across(where(is.character), ~ length(unique(.x))))
Run Code Online (Sandbox Code Playgroud)
结果是 1 x 8 tibble。
我理解cross的第一个论点,让我困惑的是第二个论点。什么~length(unique(.x))意思?.x 代码是什么意思?我知道长度被应用于 tibble 中的每个字符向量,但是“唯一”对代码片段有什么作用?
我自己尝试过什么来解决这个问题? 我曾尝试使用 Google 搜索 [R] ~ 运算符,但未收到相关结果。我还尝试了 rdrr.io、r-project.org 和 CRAN,但没有解决。以及 tidyverse.org 和 purrr 的文档——这是因为看到有人在他们的代码中使用完全相同的语法时引用了 purrr。
题:
有人可以帮助我了解内部发生的事情吗?
这就是所谓的呼噜声式的λ,从波浪号~,并使用.x以指已经在被选择的每个单独的列.cols的说法。所以:
# We can either use
starwars |> summarize(across(where(is.character), ~ length(unique(.x))))
# Or we can define our anonymous function like this
starwars |> summarize(across(where(is.character), function(x) length(unique(x))))
Run Code Online (Sandbox Code Playgroud)
它们是等价的。但应该注意的是,您指定了要应用于starwars类数据集中每一列的函数character。为此,在这段代码中,它使用where函数作为一个助手,它应用一个函数(这里is.character)来只选择那些属于类字符的列。然后我们对它们中的每一个应用我们的匿名函数并将结果保存在一个单独的列中。所以.x这里代表类字符的每一列。请注意,这|>是 R 新创建的本地管道运算符。我们通常%>%与tidyverse包一起使用,但两者都在做同样的工作,将它的结果替换为它LHS的第一个参数,RHS这通常是(在这种情况下).data争论。这里还要提到一件事,尽管它在下面被用于另一个目的。为了了解lambda-style-formula后端是如何解释的,我们可以使用as_mapper大多数 purrr 函数允许的各种函数规范背后的强大功能:
library(purrr)
> as_mapper(~ length(unique(.x)))
<lambda>
function (..., .x = ..1, .y = ..2, . = ..1)
length(unique(.x))
attr(,"class")
[1] "rlang_lambda_function" "function"
Run Code Online (Sandbox Code Playgroud)
如果你注意它的输出,你会发现它被解释为我们通常使用的匿名函数。
有关更多信息,您可以阅读此文档。