data.table错误,导致R中的段错误

时间:2013-04-16 20:41:42

标签: r data.table

以下代码段落{my R 2.15.0,运行data.table 1.8.9

library(data.table)
d = data.table(date = c(1,2,3,4,5), value = c(1,2,3,4,5))

# works as expected
d[-5][, mean(value), by = list(I(as.integer((date+1)/2)))]

# crashes R
d[-5, mean(value), by = list(I(as.integer((date+1)/2)))]

在相关的说明中,以下两个命令具有非常不同的输出:

d[-5][, value, by = list(I(as.integer((date+1)/2)))]
#    I value
# 1: 1     1
# 2: 1     2
# 3: 2     3
# 4: 2     4

d[-5, value, by = list(I(as.integer((date+1)/2)))]
#    I         value
# 1: 1 2.121996e-314
# 2: 1 2.470328e-323
# 3: 2 3.920509e-316
# 4: 2 2.470328e-323

更简单的命令使我的R从评论中崩溃:

d[-5, value, by = date]

正如里卡多指出的那样,负面索引与by的结合会产生问题。

2 个答案:

答案 0 :(得分:4)

一个假设是问题与[.data.table中的以下几行有关:

o__ = if (length(o__)) irows[o__]
              else irows
在这种情况下,

o__最终会被传递给C代码(dogroups.C)-5。可以想象这导致指针算法导致段错误和/或错误值的问题。

可能的解决方法是使用data.table的非连接语法:

d[!5, mean(value), by = list(I(as.integer((date+1)/2)))]

在通往C:

的路上经过一些不同的逻辑
if (notjoin) {
            ... Omitted for brevity ...
            i = irows = if (length(irows)) seq_len(nrow(x))[-irows] else NULL
        }

答案 1 :(得分:4)

更新:这已在v1.8.11中修复。来自NEWS

  

i中的负索引导致崩溃或错误的聚合结果已修复#2697。   感谢Eduard Antonyan(eddi)的报道。测试补充说。