使用data.table时R出现奇怪错误

使用data.table时R出现奇怪错误,r,data.table,R,Data.table,我正在做一些小计算,我决定在data.table中填充数据,因为它比data.frame和rbind快得多 所以我的代码基本上是这样的: df是计算中使用的数据帧,但它包含什么很重要 l=12000 dti = 1 dt = data.table(ni = 0, nj = 0, regerr = 0) for (i in seq(1,12000,200)) { for (j in seq(1, 12000, 200)) { for (ind in 1:nrow(df))

我正在做一些小计算,我决定在
data.table
中填充数据,因为它比
data.frame
rbind
快得多

所以我的代码基本上是这样的:

df
是计算中使用的
数据帧
,但它包含什么很重要

l=12000
dti = 1
dt = data.table(ni = 0, nj = 0, regerr = 0)
for (i in seq(1,12000,200)) {
    for (j in seq(1, 12000, 200)) {
        for (ind in 1:nrow(df)) {
            if( i+j >= l/2 ){
                df[ind,]$X =  df[ind,]$pos * 2
            } else {
                df[ind,]$X = df[ind,]$pos/l
            }
        }
        for (i in 1:100) { # 100 sample
            sample(df$X,nrow(df), replace=FALSE) 
            fit=lm(X ~ gx, df)   #linear regression calculation
            regerror=sum(residuals(fit)^2)

            print(paste(i,j,regerror))
            set(dt,dti,1L,as.double(i))             
            set(dt,dti,2L,as.double(j))             
            set(dt,dti,3L,regerror)             
            dti=dti+1

        }
     }
 }
代码打印前几轮的
打印(粘贴(i,j,regerror))
,然后退出此错误:

 *** caught segfault ***
address 0x3ff00008, cause 'memory not mapped'
Segmentation fault (core dumped)
编辑


欢迎提出任何想法。

我不想显得粗鲁,但我认为在继续之前,您可以先阅读一些R教程。这个问题也很可能因为过于本地化而被关闭。另外,
seg故障几乎总是某个地方的一个bug,但是通过了解代码的每一部分都在做什么,您可以避免一大堆这样的头痛。既然是星期五,让我们来浏览一下:

if( i+j >= l/2 ){
   data[ind,]$X =  df[ind,]$pos * 2
}
else{
   data[ind,]$X = df[ind,]$pos/l
}
我假设
数据
应该是
df
,然后从那里开始。我们在
i
j
的两个循环中,这两个循环都从1到20000。它们的总和永远不会小于
1/2
,因此您将始终执行第一条语句。此外,如果您曾期望出现
FALSE
情况,则需要将
else
与右大括号放在同一行:

if (i + j >= 1/2) {
   df$X <- df$pos * 2
} else {
   df$X <- df$pos
}

获取,
样本(df$X,nrow(df),replace=FALSE)
只会显示新订单。它没有实际分配它们。相反,
df$X@Arun在两个i索引中,我在写问题时出现了一个错误,但基本上函数在这个循环中计算了一些东西(在写的地方,我计算了一些东西),然后我洗牌,对洗牌后的数据应用回归,然后我保存在数据中。表如果你想提供,我想你可能会得到答案。我敢肯定,对于您正在做的事情,三个for循环并不是最有效的技术。就目前情况而言,如果不知道什么是
df
,也不知道至少一点关于最内层for循环中发生的事情,我就无法完全了解那里发生了什么。@Justin我已经用df数据框和最内层循环中的代码更新了我的问题。.谢谢你的回答,但首先,你提到的1不是它的l,其次这只是一个测试脚本,我想要实现的实际想法更复杂,你不能使用矢量化的东西。因为它包括其他函数,这些函数会将'X分配给df',以及关于采样,是的,你提到的是我想做的。但我的问题是,60*60*100没有填入
数据中。表
相反,我得到了我复制的错误。我建议你将问题分解为可管理的部分,特别是导致错误的部分。然后朝着一个最小的可重复的例子努力,这个例子仍然会给出错误,并将这个工作例子发布到一个新的问题上。使用您提供的代码,不存在seg故障,而是
示例
行中出现错误。
if (i + j >= 1/2) {
   df$X <- df$pos * 2
} else {
   df$X <- df$pos
}
for (i in 1:100) { # 100 sample
   sample(df$X,nrow(df), replace=FALSE) 
   fit=lm(X ~ gx, df)   #linear regression calculation
   regerror=sum(residuals(fit)^2)

   print(paste(i,j,regerror))
   set(dt,dti,1L,as.double(i))             
   set(dt,dti,2L,as.double(j))             
   set(dt,dti,3L,regerror)             
   dti=dti+1
}
df$X <- df$pos * 2
fit.fun <- function(n, dat) {
   jumble <- sample(nrow(dat))
   dat$X <- dat$X[jumble]
   sum(residuals(lm(X ~ gx, dat))^2)
}

sapply(1:10, fit.fun, dat=df)