为简洁起见:
我有一对预先指定的data.tables,每行有几万行,每行几列。我试图从一个表聚合一列,并将结果分配给另一个表。
问题是我在分配时遇到以下错误:
Error in SYS[[length(SYS) - 3L]][[1L]] == "knit_print.default" :
comparison (1) is possible only for atomic and list types
代码本身不会崩溃,但是当我查看/打印返回值时,错误消息基本上取代了数据表。或者似乎这样做。
除了Data.table的Github源代码之外,谷歌搜索才能找到它。所以我看了一下它,唯一相似的是45-50行,似乎是在就地分配期间抑制/延迟打印输出。我没有找到关于此错误的其他文档。我还没有能够创建一个MRE(仍在尝试),因为剥离代码最终会得到工作示例,所以很明显我错过了破坏它的东西。我怀疑,如果我发现它,我将能够回答我自己的问题。
我发布这个是因为我希望有人在这里可能知道错误意味着什么,这将有助于我在我的代码中查明问题,并修复它或围绕它创建一个错误报告的MRE。
我已经确定源代码中的赋值失败(仅对一个表,对另一个没有问题),但是中断执行并将相同的赋值复制到控制台中工作正常。所以它似乎不是我的语法或数据的问题。
更新:最小可重复示例
3天后,我确定了问题。
alloc_out <- function(annot = c("a", "b")) {
Genes <- data.table("parent" = annot, flag = NA)
ro <- structure(list("Genes" = Genes), class="dtu")
ro$Genes[, flag := TRUE] # This causes the error message
# when executed from source,
# but works in console.
return(ro)
}
R版本:OSX El Capitan上的RStudio中的3.2.4 // data.table版本:1.9.6
答案 0 :(得分:2)
正如我所怀疑的那样,确定错误并创建MRE是相辅相成的(按此顺序)。
我的代码中的问题是由以下行引起的:
ro <- structure(list("Genes" = Genes), class="dtu")
具体由class属性。出于某种原因(从strucutre()的文档中不明显),该属性会破坏它。如果我省略属性赋值,一切都按预期工作。
这并没有真正解释为什么错误发生在更深层次上。正是在我的代码中导致它的原因。