使用data.tables,我有一个包含其他函数的大函数do.everything()
并返回data.table
。我用它运行它:
DT.processed <- do.everything(datatable = DT.unprocessed)
没有产生错误输出,但似乎某处存在隐藏错误,因为在运行first.manipulation()
之后,某些NA被插入某些变量
library(data.table)
first.manipulation <- function(datatable) {
datatable <- datatable[order(Year)]
datatable <- datatable[Year %in% c(2001, 2002, 2003)] # for some reason, some NA appear in some variables!
...
return(datatable)
}
second.manipulation <- function(datatable) {
...
return(datatable)
}
do.everything <- function(datatable) {
datatable <- first.manipulation(datatable = datatable)
datatable <- second.manipulation(datatable = datatable)
return(datatable)
}
因此first.manipulation()
似乎存在问题。
为了解决这个问题,我重写了它,以便在每个命令之前/之后导出datatable
的状态,并确定导致这个“NA插入”问题的原因:
first.manipulation <- function(datatable) {
datatable.step.1 <<- datatable
datatable <- datatable[order(Year)]
datatable.step.2 <<- datatable
datatable <- datatable[Year %in% c(2001, 2002, 2003)]
datatable.step.3 <<- datatable
return(datatable)
}
我发现datatable.step.1
datatable.step.2
和datatable.step.3
都没有“NA问题”,但first.manipulation <- function(datatable) {
datatable.step.1 <<- datatable
datatable <- datatable[order(Year)]
datatable.step.2 <<- datatable
print(colSums(is.na(datatable)))
datatable.step.2.debug.1 <<- datatable.step.2
datatable.step.2.debug.2 <<- datatable.step.2.debug.1[Year %in% c(2001, 2002, 2003)]
datatable <- datatable[Year %in% c(2001, 2002, 2003)]
datatable.step.3 <<- datatable
print(colSums(is.na(datatable)))
return(datatable)
}
确实存在“NA问题”。我无法理解为什么会这样,所以我把它改写成:
datatable.step.3
问题是即使在此之后,
datatable.step.2.debug.2
与datatable.step.3
不同。
datatable.step.2.debug.2
表示“NA问题”,而print(colSums(is.na(datatable)))
没有表示。
为什么会这样?
其次,两个0
,在任何地方都返回print()
,而第二个datatable = datatable
显然有NAs。这是预期的吗?
最后,在do.everything()
的定义中使用{{1}}是一种好习惯吗?
显然,我对任何其他建议持开放态度。