为简洁而编辑:
我有一对预先分配的data.tables,每行有几万行,每行几列.我试图从一个表聚合一列,并将结果分配给另一个表.
问题是我在分配时收到以下错误:
Error in SYS[[length(SYS) - 3L]][[1L]] == "knit_print.default" :
comparison (1) is possible only for atomic and list types
代码本身不会崩溃,但是当我查看/打印返回值时,错误消息基本上取代了数据表.或者它似乎这样做.
谷歌搜索除了数据的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
最佳答案 正如我所怀疑的那样,确定错误并创建MRE是相辅相成的(并按此顺序).
我的代码中的问题是由这一行引起的:
ro <- structure(list("Genes" = Genes), class="dtu")
具体由class属性.出于某种原因(从strucutre()的文档中不明显),该属性会破坏它.如果我省略属性赋值,一切都按预期工作.
这并没有真正解释为什么错误发生在更深层次上.正是在我的代码中导致它的原因.