【问题标题】:Behaviour of keep.rownames in R data.table::setDT()R data.table::setDT() 中 keep.rownames 的行为
【发布时间】:2021-12-31 20:41:20
【问题描述】:

我只是在使用 data.table (library(data.table)) 尝试一些代码,并注意到我发现奇怪的行为。为什么这里的第一个代码将行名放入 rn 变量中,而第二个 sn-p 没有?我很好奇为什么会这样。我原以为copy() 和assign 是在setDT() 之前完成的,因此不必分两个单独的步骤执行。

保留行名:

dtcars <- copy(mtcars)
setDT(dtcars, keep.rownames=TRUE)

不保留行名:

setDT(dtcars <- copy(mtcars), keep.rownames=TRUE)

我什至尝试将赋值表示为一个函数,以确保它首先运行

setDT(`<-`(dtcars, copy(mtcars)), keep.rownames=TRUE)

将此与以下在调用 mean() 之前分配 x 的情况进行比较——我希望我的第二个 sn-p 表现得像这样,但如果以下表现得像我的第二个 sn-p 它将返回 @987654330 @。

mean(x <- c(rnorm(10, 0, 1), NA), na.rm=TRUE)

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    如您所知,&lt;- 运算符被解析为 R 中的函数调用(对 `&lt;-` 函数)。您似乎不知道的是每个函数都有一个返回值(即使它只是NULL 并且不可见)。

    `&lt;-` 函数具有为符号赋值的副作用。它的(不可见的)返回值是分配的值。这就是为什么你可以做y &lt;- x &lt;- 1之类的事情。

    在您的第二个和第三个示例中,setDT 传递了`&lt;-` 的返回值,这是一个 data.frame 但未绑定到符号。但是,您想将符号 dtcars 传递给它,这就是您的第一个示例中发生的情况。

    由于返回值是分配的data.frame的浅拷贝,分配的data.frame也变成了data.table。但是,我对 C 的理解不足以理解(从源代码中)为什么将 rn 列添加到返回值不会也将其添加到分配的 data.table 中。我建议submitting an issue

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2014-06-15
      • 2019-02-09
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2017-06-14
      相关资源
      最近更新 更多