如何使用 Traceback 和调试来修复损坏的 R 代码?
How to use Traceback and debug to fix broken R code?
我正在尝试编写一个脚本来简化从用于文本挖掘和 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
堆:
- 你的错误在
quick_clean
- 在
corp <- tm_map(corp, removePunctuation)
线上,幸好你只有一个
- 在
tm_map
函数本身正在调用方法 tm_map.VCorpus
,因为您的 corp 对象属于 class Vcorpus
并且 tm_map 是不同的方法
- 这个函数本身正在调用
tm_parLapply
等等...
从你在 traceback
中找到一个可靠的函数开始,再进一步通常就没有那么有用了,这意味着你给函数的输入不好。
我们得知你给了一个 Vcorpus
对象作为第一个参数,所以这个似乎没问题,不过我们稍后可能会检查它的格式是否有问题。
但是让我们检查另一个参数,removePunctuation
,文档 (?tm_map
) 说它需要一个函数,如果你使用 debug
、debugonce
或 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)
糟糕,这是一个布尔值。
输入 Q
或转义键退出浏览器。
debug
类似于 browser
,但从函数的第一行开始。
我正在尝试编写一个脚本来简化从用于文本挖掘和 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
堆:
- 你的错误在
quick_clean
- 在
corp <- tm_map(corp, removePunctuation)
线上,幸好你只有一个 - 在
tm_map
函数本身正在调用方法tm_map.VCorpus
,因为您的 corp 对象属于 classVcorpus
并且 tm_map 是不同的方法 - 这个函数本身正在调用
tm_parLapply
等等...
从你在 traceback
中找到一个可靠的函数开始,再进一步通常就没有那么有用了,这意味着你给函数的输入不好。
我们得知你给了一个 Vcorpus
对象作为第一个参数,所以这个似乎没问题,不过我们稍后可能会检查它的格式是否有问题。
但是让我们检查另一个参数,removePunctuation
,文档 (?tm_map
) 说它需要一个函数,如果你使用 debug
、debugonce
或 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)
糟糕,这是一个布尔值。
输入 Q
或转义键退出浏览器。
debug
类似于 browser
,但从函数的第一行开始。