expand.gridとas.data.frame.characterにおけるfactorへの変換挙動の違い

こんな話がある。
http://uribo.hatenablog.com/entry/2015/11/22/173837
まあ実装が違うんだろうということで、関数の中身をみてみると、expand.gridの中ではfactor関数でunique関数をかけてlevelsを指定しているのに対し、as.data.frameではlevelsを指定していない
指定していないということはfactorのデフォルトの挙動になるということで、デフォルトではuniqueしてsort.listした上でそれをfactorのlevelsに指定している。
つまり違いはuniqueした後にsort.listをかけているかどうかということであり、結果として上記記事のような挙動になる。

# expand.gridではlevelsを指定している
x <- factor(x, levels = unique(x))
# as.data.frame.characterではlevelsを指定していない
x <- factor(x)
# 指定していない場合以下のようなコードでlevelsが指定される
if (missing(levels)) {
    y <- unique(x, nmax = nmax)
    ind <- sort.list(y)
    y <- as.character(y)
    levels <- unique(y[ind])
}