将向量分配给data.table列

时间:2016-06-24 14:46:01

标签: r data.table knitr

为简洁起见:

我有一对预先指定的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

1 个答案:

答案 0 :(得分:2)

正如我所怀疑的那样,确定错误并创建MRE是相辅相成的(按此顺序)。

我的代码中的问题是由以下行引起的:

ro <- structure(list("Genes" = Genes), class="dtu")

具体由class属性。出于某种原因(从strucutre()的文档中不明显),该属性会破坏它。如果我省略属性赋值,一切都按预期工作。

这并没有真正解释为什么错误发生在更深层次上。正是在我的代码中导致它的原因。