dplyr::arrange
是一个S3通用函数,它只具有为数据帧(或对象)定义的方法inherit
class "data.frame"
,例如小标题)。如果我们看一下代码dplyr:::arrange.data.frame
, 我们看:
function (.data, ..., .by_group = FALSE, .locale = NULL)
{
dots <- enquos(...)
if (.by_group) {
dots <- c(quos(!!!groups(.data)), dots)
}
loc <- arrange_rows(.data, dots = dots, locale = .locale)
dplyr_row_slice(.data, loc)
}
该函数实际上并不对任何东西进行排序;相反,它调用未导出的函数arrange_rows
对其进行排序。
查看代码arrange_rows
(通过输入dplyr:::arrange_rows
到控制台),我们看到这个函数本身将实际的排序委托给another未导出的函数被调用vec_order_radix
.
当我们查看代码时that函数,我们看到它本身也不进行排序,而是调用一个名为vctrs_order
通过进行排序.Call
界面。
The vctrs_order
函数已定义here https://github.com/r-lib/vctrs/blob/8bbd8c4a69a9b3e2c42aa752c5339f949562af96/src/order.c#L183,从上面的代码注释我们可以看到,它根据传递的向量类型进行不同的调度。对于短向量(当前定义为少于 128 个元素),它将使用插入排序,对于较长向量,它将使用基数排序(整数向量除外,如果元素数在 128 到 10000 之间,它将使用计数排序)。如果您选择,可以按照此处的 C 代码来详细检查它是如何完成的。
但最重要的是,R 代码中根本没有完成排序 - 它是usually用 C 实现的基数排序。