data.table::setorder on data.frame 输入顺序仅排序列

ami*_*itr 7 r data.table

我将 a 传递data.frame给一个使用 对其进行排序的函数data.table::setorder。在排序之前,我正在调用data.table::setDT输入(实际上我需要稍后data.table在输入上调用一些特定函数)。这是我正在使用的功能:

test_order <- function(x) {
  data.table::setDT(x)
  data.table::setorder(x, score)
}
Run Code Online (Sandbox Code Playgroud)

我就是这样称呼它的:

x0 <- data.frame(id = 1:3, score = c(20, 10, 30))
x1 <- test_order(x0)
Run Code Online (Sandbox Code Playgroud)

结果看起来很奇怪:

  • 的类型x0改为a data.table- 看起来还可以;
  • 该列x0$id未修改- 它的地址(使用)保持不变,并且也保持原始顺序data.table::address
  • 该列x0$score也保留在相同的地址,但现在已排序,因此它与列不同步id
  • 结果x1行排序正确;此外,该列与的列score位于同一地址,但该列当然位于不同的地址。这是我得到的:scorex0id
> x0
  id score
1  1    20
2  2    10
3  3    30
> x1 <- test_order(x0)
> x0
   id score
1:  1    10
2:  2    20
3:  3    30
> x1
   id score
1:  2    10
2:  1    20
3:  3    30

Run Code Online (Sandbox Code Playgroud)

最“令人惊讶”的事情是对象的数据完整性丢失x0-id列保持原始顺序但score列已排序,因此行与原始对象的行不同。如果我没有调用setDT或者传递一个data.table对象而不是data.frame.

软件包的版本data.table是1.14.2