6

我有以下示例:

irisDT <- as.data.table(iris)

mod <- function(dat) {
  dat[, index:=(1:nrow(dat))]
  setkey(dat, index)

  dat <- dat[2:10]

  dat[, index:=NULL]
  invisible()
}

mod(irisDT)
names(irisDT) # it contains index

mod() 令我惊讶的是,调用函数后索引列仍然存在。当我删除该行时,情况并非如此dat <- dat[2:10]。我猜想,由于还不能通过引用删除行,因此创建了另一个 data.table。但是,我想删除原始data.table中的索引列。

4

1 回答 1

5

好问题。 以通常的 R 方式由 更改data.table 复制。<-

它不是由包提供:=set*功能(setkey, setnames, setattr)在更改时复制的。data.table

因此,决定副本与否的对象本身并没有什么特别之处data.table,它作为参数传递给函数,其方式与data.frame. 重要的是您在函数内部对其执行的操作。操作员在更改时复制,<-data.table. :=另一方面,操作员通过引用进行分配。

正如您所说,(还)无法通过引用删除行,因此在此之前您需要使用标准 R 语法将副本分配回调用范围内的符号。

碰巧的是,昨晚的 LondonR 演讲中有一张幻灯片,现在在主页上的演示部分下(请参阅带有标题的幻灯片copy())。

于 2012-06-20T12:50:02.503 回答