如何使用回溯和调试来修复损坏的 R 代码?



我正在尝试编写一个脚本,以简化从向量或数据帧生成用于文本挖掘和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)

我还运行了调试并得到了以下内容...同样,我不确定如何使用此信息:

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]> 

我在这里做错了什么?

让我们从底部检查traceback堆:

  1. 您的错误在quick_clean
  2. 它在corp <- tm_map(corp, removePunctuation)线上,幸运的是你只有一个
  3. tm_map函数内部调用方法tm_map.VCorpus,因为您的 corp 对象属于类Vcorpus并且 tm_map 是不同方法的包装器
  4. 这个函数本身正在调用tm_parLapply等...

从你在traceback中点击一个可靠的函数开始,走得更远通常不是那么有用,这意味着你给函数的输入不好。

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

但是让我们检查另一个参数,removePunctuation,文档(?tm_map(说它需要一个函数,如果你使用debugdebugoncebrowser(查找它们(。 您将在执行该行时看到它们的布尔值。

它们是布尔值,因为您像这些函数一样命名函数参数。

因此,重命名您的函数参数,希望它能:)运行良好。

以下是您可以使用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)哎呀,这是一个布尔值。 键入Q或 Esc 键以退出浏览器。

debug类似于browser,但从函数的第一行开始。

最新更新