【发布时间】:2020-11-13 06:39:05
【问题描述】:
“tidyselect”包提供了一个选择帮助函数where。 where 用于选择具有自定义功能的数据框列。它是“tidyselect”的一个内部函数。这意味着where 不会加载到您的命名空间中,您只能通过tidyselect:::where 调用它。
但是,我从dplyr vignettes: columnwise operations 看到了以下示例。
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
在此示例中,where 的编写没有前缀“tidyselect:::”,但很明显,代码中没有错误,它产生了有意义的结果。这对我来说似乎很奇怪。我想知道为什么代码正常运行。
我猜这是由于“代码引用”,这是 tidyeval 方法的一部分。粗略地说,代码引用将代码作为表达式挂起,然后在“内部环境”中评估表达式。这只是一个直观的猜测,我不知道如何测试它。
我希望有人可以帮助我解决“哪里”问题,或者为我留下一些关于代码如何运行的参考。
【问题讨论】:
-
dplyr包导入tidyselect包,因此 tidyselect 函数可用于dplyr代码,但不附加到全局搜索路径。 -
@MrFlick 自从我制作最后一个 R 包以来已经有一段时间了,但是在描述文件中导入包只确保包可用。如果你想使用其中的函数,你仍然需要通过它们的限定名来调用它们——即使是包内部代码。
-
@AEF 用户需要使用命名空间来限定函数,但如果包使用非标准评估,则包可以在他们喜欢的任何环境/命名空间中评估这些符号。因此,他们可以将未计算的表达式传递给适当的 tidyselect 函数,并且 tidyselect 将可以访问其命名空间中的所有函数。
标签: r dplyr tidyverse tidyselect