如何调试错误,如:" dim(x)必须具有正长度"用插入符号

时间:2016-12-19 06:56:37

标签: r r-caret

我正在运行类似于插入符指南中的预测的预测:

Caret Measuring Performance

predictions <-  predict(caretfit, testing, type = "prob")

但我收到错误:

Error in apply(x, 1, paste, collapse = ",") : 
dim(X) must have a positive length

我想知道1)诊断这些错误的一般方法,这些错误是由于输入到这样的函数中的错误导致的,或2)为什么我的代码失败。

1) 所以看错误它与X&#39;有关。哪个参数是x?显然,第一个应用&#39;,但是预测中的哪个参数最终会通过以适用?看看traceback():

10: stop("dim(X) must have a positive length")
9: apply(x, 1, paste, collapse = ",")
8: paste(apply(x, 1, paste, collapse = ","), collapse = "\n")
7: makeDataFile(x = newdata, y = NULL)
6: predict.C5.0(modelFit, newdata, type = "prob")
5: predict(modelFit, newdata, type = "prob") at C5.0.R#59
4: method$prob(modelFit = modelFit, newdata = newdata, submodels = param)
3: probFunction(method = object$modelInfo, modelFit = object$finalModel, 
   newdata = newdata, preProc = object$preProcess)
2: predict.train(caretfit, testing, type = "prob")
1: predict(caretfit, testing, type = "prob")

现在,如果我能够遵循代码并理解问题而不是这些一般错误,那么这个问题就很容易解决了。我可以使用此回溯来跟踪代码到C5.0.R#59的代码。 (看起来似乎没有办法在每条轨迹上得到行号?)我可以按照这条代码直到第59行然后(我认为)第44行的预测函数:

Github Caret C5.0 source

但在此之后,我不确定逻辑在哪里流动。我没有看到“makeDataFile&#39;在插入源中的任何地方,或者,如果它在另一个包中,它是如何到达那里的。我也尝试过Rstudio调试,debug()和browser()。没有提供我期望从其他语言的堆栈跟踪。当您不知道错误消息的含义时,有关如何遵循代码的任何建议吗?

2)至于我的特殊投入,&#39; caretfit&#39;只是插入符号的结果,测试数据是300万行乘59列:

fitcontrol <- trainControl(method = "repeatedcv",
                       number = 10,
                       repeats = 1,
                       classProbs = TRUE,
                       summaryFunction = custom.summary,
                       allowParallel = TRUE)


fml <- as.formula(paste("OUTVAR ~",paste(colnames(training[,1:(ncol(training)-2)]),collapse="+")))
caretfit <- train(fml,
             data = training[1:200000,],
             method = "C5.0",
             trControl = fitcontrol,
             verbose = FALSE,
             na.action = na.pass)

1 个答案:

答案 0 :(得分:0)

1退出程序

您可以使用一些功能查明问题。

虽然似乎仍然无法在代码中获得带有行号的完整堆栈跟踪(Boo!),但您可以使用从回溯中获得的函数并使用函数getAnywhere()来搜索你正在寻找的功能。例如,你可以这样做:

getAnywhere(makeDataFile)

查看位置和来源。 (当这些库经常捆绑在二进制文件中时,它在windows中也很有用。)然后你必须使用source或github来查找特定的行号或跟踪代码的逻辑。

如果我跑的话,在我的特定问题中:

newdata <- testing
caseString <- C50:::makeDataFile(x = newdata, y = NULL)

(请注意三个“:”。)我可以看到此步骤在此级别完成,因此看起来好像在我的训练数据集中发生了某些事情。

所以在我的追踪中反复使用gitAnywhere()和github,我可以手动找到行号(嘘!)

  1. in caret / R / predict.train.R,predict.train(在第108行定义) 第153行调用probFunction
  2. in caret / R / probFunction,probFunction (在第3行定义)调用方法$ prob函数,它是一个存储的 fit对象中的函数caretfit $ modelInfo $ prob可以 通过将其输入控制台进行检查。这是一样的 在第58行的插入符号/ models / files / C5.0.R中找到的函数 第59行'预测'
  3. 插入符号中的某些内容可以使用 C50 / R / predict.C5.0.R,你可以通过搜索看到 getAnywhere()
  4. 此函数在第25行运行makeDataFile(部分 C50套餐)
  5. 调用paste,调用apply,会死掉 停止
  6. 2插入符号预测的特殊问题

    至于我的问题,我一直在检查代码,并在不同级别添加输入,它将成功完成。发生的事情是我对predict.train.R中的数据集进行了一些修改,导致它失败。事实证明,我没有包括我的'na.action'参数,对于我的基于树的数据,使用'na.pass'。如果我包含这个论点:

    prediction <- predict(caretfit, testing, type = "prob", na.action = na.pass)
    

    它按预期工作。 predict.train的第126行利用此参数来决定是否在预测中包含非完整案例。我的数据没有完整的案例,因此无法抱怨需要一些正长度的矩阵。

    现在如何能够知道这个应用错误的答案是由于缺少na.action参数根本不明显,因此需要一个良好的调试过程。如果有人知道其他调试方法(请记住,在Windows中,在Rstudio中单步执行库源并不能很好地工作),请回答或评论。