2014-06-26 140 views
4

考虑下面的代码为什么setDT在这种情况下不起作用?

library(data.table) # 1.9.2 
x <- data.frame(letters[1:2]) 
setDT(x) 
class(x) 
## [1] "data.table" "data.frame" 

这是预期的结果。现在,如果我跑

x <- letters[1:2] 
setDT(data.frame(x)) 
class(x) 
## [1] "character" 

xclass仍然出于某种原因没有改变。

一种可能性是setDT只更改类在全球环境中的对象,所以我试图

x <- data.frame(letters[1:2]) 
ftest <- function(x) setDT(x) 
ftest(x) 
class(x) 
##[1] "data.table" "data.frame" 

好像setDT不那么在意对象的环境,以改变它的类。

那么是什么导致上述行为?它只是一个错误,或者它背后有一些常识吗?

+2

你为什么想到,在''setDT x'”级(data.frame(X))'将被改为'data.table'? 'setDT'基本上与às.data.table'一样,但避免了大量的复制内容,这使得大数据更快。 – Beasterfield

+0

@Beasterfield我期待它做些什么。如果不改变'x',则创建一个新的对象。否则,它应该通过一个错误或至少一个警告,它实际上没有做任何IMO。例如,如果你有'x < - factor(c(“1”,“2”)); x < - as.numeric(as.character(x))','setDT'应该在本例中扮演as.numeric'角色 –

+0

@DavidArenburg,我认为问题在于setDT(data.frame x)),data.frame将x复制到一个新的data.frame对象中,所以setDT看不到原始的x,因此不能更改原始的x。 –

回答

5

setDT更改data.frame并将其无形地返回。既然你不保存这个data.frame,它就会丢失。所有你需要做的就是保存data.frame,这样data.table也会被保存。例如。

setDT(y <- data.frame(x)) 
class(y) 
## [1] "data.table" "data.frame" 

z <- setDT(data.frame(x)) 
class(z) 
## [1] "data.table" "data.frame" 
+1

+1。 'setDT'通过引用它传递的数据来改变,不管它是否被命名(即绑定到一个符号)。在分配结果之前,还有一种用途是在复合表达式中;例如'ans = setDT(<返回data.frame>的东西)[where,select | update,by]' –

相关问题