当前位置: 首页 > 知识库问答 >
问题:

为什么tidyselect辅助函数“where”可以在dplyr辅助函数“cross”内部检测到?

惠野
2023-03-14

tidyselect包提供了一个选择帮助函数wherewhere用于使用自定义函数选择数据帧列。它是tidyselect的内部函数。这意味着where不会加载到您的命名空间中,您只能通过tidyselect::: where调用它。

然而,我从dplyr vignettes中看到了以下示例:列操作。

starwars %>% 
  summarise(across(where(is.character), ~ length(unique(.x))))
#> # A tibble: 1 x 8
#>    name hair_color skin_color eye_color   sex gender homeworld species
#>   <int>      <int>      <int>     <int> <int>  <int>     <int>   <int>
#> 1    87         13         31        15     5      3        49      38

在本例中,其中不带前缀“tidyselect:::”,但很明显,代码中没有错误,它会产生有意义的结果。这对我来说很奇怪。我想知道为什么代码能正常工作。

我猜是因为“代码引用”,这是tidyeval方法论的一部分。粗略地说,代码引用将代码作为表达式挂起,然后在“内部环境”中对表达式求值。这只是一个直观的猜测,我不知道如何测试。

我希望有人能帮助我解决“where”问题,或者为我留下一些关于代码如何工作的参考。

共有1个答案

阎鸿煊
2023-03-14

您没有说明在您的示例中附加了哪些包,但让我们假设唯一附加的包是 dplyr

library(dplyr)

首先,我们注意到函数,其中未附加,即当前R会话未知。我们只需在控制台中键入其名称(不带括号)即可进行检查。如果附加了函数,我们现在可以看到它的源代码。相反,我们得到一个错误,即未找到所在的对象

但是,我们注意到dplyr整洁选择附加了其他功能,starts_with就是一个例子。如果我们重复在控制台中键入名称的实验,我们现在会看到源代码,并且函数源自 tidyselect 命名空间:

> starts_with
function (match, ignore.case = TRUE, vars = NULL) 
{
    check_match(match)
    vars <- vars %||% peek_vars(fn = "starts_with")
    if (ignore.case) {
        vars <- tolower(vars)
        match <- tolower(match)
    }
    flat_map_int(match, starts_with_impl, vars)
}
<bytecode: 0x0000027338e5f8e8>
<environment: namespace:tidyselect>

在这种情况下,函数starts_with由dplyr使用NAMESPACE文件附加,您可以在其中列出应该与您的包一起附加的其他包中的函数。您可以签入dplyr源代码。

中的并不像我们已经看到的那样可用。在这种情况下,函数确实被引用,并且只在tidyselect包中进行评估。如果查看across的源代码,您会注意到在第82行中,列规范被传递给同一文件中定义的函数across_setup。在这个函数中,列规范被引用(第174、175行),然后发送到函数tidyselect::eval_select(第177行)。然后,此函数是tidyselect包的一部分,可以访问where

 类似资料:
  • 简介 Laravel 包含各种各样的全局「辅助」PHP 函数,框架本身也大量地使用了这些功能;如果你觉得方便,你可以在你的应用中自由的使用它们。 可用方法 数组 & 对象 array_add array_collapse array_divide array_dot array_except array_first array_flatten array_forget array_get arra

  • 列标字符转化 获取扩展版本 查看作者信息

  • 辅助函数,顾名思义,是帮助我们完成特定任务的函数。每个辅助函数文件仅仅是一些函数的集合。例如,URL Helpers 可以帮助我们创建链接,Form Helpers 可以帮助我们创建表单,Text Helpers 提供一系列的格式化输出方式,Cookie Helpers 能帮助我们设置和读取COOKIE, File Helpers 能帮助我们处理文件,等等。 跟其他部分不同的是,辅助函数不是用类的

  • 辅助函数,顾名思义,是帮助我们完成特定任务的函数。每个辅助函数文件都是某一类 函数的集合。例如, URL 辅助函数 帮助我们创建链接,表单辅助函数**帮助 我们创建表单元素,**本文辅助函数 帮助我们处理文本的格式化,Cookie 辅助函数 帮助我们读取或设置 Cookie ,文件辅助函数 帮助我们处理文件,等等等等。 不同于 CodeIgniter 中的大多数系统,辅助函数没有使用面向对象的方式

  • 存放位置 Laravel 提供了很多 辅助函数,有时候我们也需要创建自己的辅助函数。 必须 把所有的『自定义辅助函数』存放于 app 文件夹中。 并在 composer.json 文件中加载,方法请见: Laravel 的自定义函数 helpers.php 文件存放位置

  • xml辅助函数文件包含了一些辅助处理xml数据的函数 加载该辅助函数 本辅助函数通过如下代码加载:$this->load->helper('xml'); 可用函数如下: xml_convert('string') 以一个字符串(string)作为输入并且转换下列xml保留字符成为实体(entities): 连字号: & 小于和大于号: 单引号和双引号: ' " 破折号: - 该函数将忽略 & 如果