如何使用Traceback和debug来修复损坏的R代码?

时间:2017-08-09 17:35:29

标签: r function debugging text-mining traceback

我试图编写一个脚本,简化了从文本挖掘和NLP的向量或数据框架生成干净语料库的过程。但是,我的脚本在运行时会产生错误。我的脚本如下:

  quick_clean <- function(data, Vector = TRUE, removeNumbers = TRUE, removePunctuation = TRUE, 
                     stop.words = NULL, ...) {
  if(Vector == TRUE) {
    source <- VectorSource(data)
  } else {
    source <- DataframeSource(data)
  }
  corp <- VCorpus(source)
  corp <- tm_map(corp, stripWhitespace)

  if(removePunctuation == TRUE) {
    corp <- tm_map(corp, removePunctuation)
  }
  if(removeNumbers == TRUE) {
    corp <- tm_map(corp, removeNumbers)
  }
  if(is.null(stop.words)) {
   return(corp)
  } else {
    corp <- tm_map(corp, removeWords, c(stopwords("en"), stop.words))
  }
  corp
}

当我运行它时,我收到以下错误:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
object 'FUN' of mode 'function' was not found 

我跑了回溯,但我不确定如何使用这些信息:

7. get(as.character(FUN), mode = "function", envir = envir) 
6. match.fun(FUN) 
5. lapply(X, FUN, ...) 
4. tm_parLapply(content(x), FUN, ...) 
3. tm_map.VCorpus(corp, removePunctuation) 
2. tm_map(corp, removePunctuation) 
1. quick_clean(swift_vec)

我也运行了Debug并得到了以下内容...再次,我不确定如何使用此信息:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'FUN' of mode 'function' was not found
Called from: get(as.character(FUN), mode = "function", envir = envir)
Browse[1]> 

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

让我们从底部检查traceback桩:

  1. 您的错误位于quick_clean
  2. 它在corp <- tm_map(corp, removePunctuation)行,幸运的是你只有一个
  3. tm_map内,函数本身正在调用方法tm_map.VCorpus,因为你的corp对象是类Vcorpus而tm_map是不同方法的包装器
  4. 此函数本身正在调用tm_parLapply等...
  5. 从你在traceback中找到一个可靠的函数开始,它往往没那么有用,这意味着你给函数的输入不好。

    我们了解到你给了一个Vcorpus对象作为第一个参数,所以这个似乎没问题,但我们可以稍后检查它的格式是否有问题。

    但是让我们检查另一个参数removePunctuation,文档(?tm_map)说它需要一个函数,如果你使用debugdebugonce或{{1} (看看他们)。你会在执行该行时看到它们的布尔值。

    它们是布尔值,因为你将函数参数命名为那些函数。

    所以重命名你的函数参数,希望它运行正常:)。

    以下是您使用browser的方式:

    定义此功能(找到添加的行)

    browser

    执行触发错误的行 输入quick_clean <- function(data, Vector = TRUE, removeNumbers = TRUE, removePunctuation = TRUE, stop.words = NULL, ...) { if(Vector == TRUE) { source <- VectorSource(data) } else { source <- DataframeSource(data) } corp <- VCorpus(source) corp <- tm_map(corp, stripWhitespace) if(removePunctuation == TRUE) { browser() # <----------------------------------------- here ! corp <- tm_map(corp, removePunctuation) } if(removeNumbers == TRUE) { corp <- tm_map(corp, removeNumbers) } if(is.null(stop.words)) { return(corp) } else { corp <- tm_map(corp, removeWords, c(stopwords("en"), stop.words)) } corp } 以确认我们已知的内容 输入class(corp) 哎呀,这是一个布尔值。 键入class(removePunctuation)或转义键以退出浏览器。

    Qdebug类似,但从函数的第一行开始。