R函数最后一行删除data.table列时返回空值问题咨询
问题原因
该现象是data.table的:=原地修改运算符的默认特性导致的,并非函数真的返回了空值:
:=是data.table特有的按引用修改操作,执行该操作后表达式的返回值默认是*不可见(invisible)*的- 你提供的示例代码中,函数最后执行的表达式是
div[, state := NULL],整个函数的返回值继承了该操作的不可见属性 - 直接调用
dmap()时,R控制台默认不会打印不可见的返回值,看起来就像返回了空值;如果执行res <- dmap()就可以看到res中存储了完整的拼接结果 - 当你在return前添加
print(div)/str(div)/setorder()等操作时,函数最后执行的表达式变成了这些操作的返回值,这类操作的返回值是可见的,所以控制台就会正常打印结果
解决方法
只需要在完成:=操作后,加一行data.table的空切片调用即可,修改后的函数示例如下:
library(data.table) dmap <- function(){ xx = unlist(strsplit('abcpqr', '')) div = data.table(division=rep(c('abc', 'pqr'), each=3), state=xx) stc = data.table(state=xx, stcd = 1:6) div = div[stc, on='state'] div[, state := NULL] div[] # 新增这一行,返回可见的data.table对象 return(div) } dmap()
你也可以直接将return语句修改为return(div[]),效果完全一致。
内容的提问来源于stack exchange,提问作者Baan Bapat
相关产品推荐
相关产品推荐

