我正在寻找一个处理警告消息的解决方案,来自Kmeans
包的amap
功能。警告消息如下:
empty cluster: try a better set of initial centers
。
无论如何我可以得到一个信号,所以可以知道什么时候抛出这个错误信息,然后处理问题? (例如:运行算法,直到返回没有空簇)
很难为我做一个很好的可重复的例子。但是,我带着这个丑陋但功能性来了:
library(amap)
numberK = 20
ts.len = 7
time.series <- rep(sample(1:8000, numberK, replace = TRUE),ts.len)
time.series <- rep(rbind(time.series, time.series), 30)
time.series <- matrix(time.series, ncol = ts.len)
centers <- matrix( sample(1:3000, numberK*ts.len), ncol = ts.len)
Kmeans((time.series), centers = centers, iter.max = 99)
如果你在终端上运行它,它可能会向你发送我正在谈论的警告信息。
注意: 我解决此问题的想法是捕获警告的信号,然后执行解决方案。但是,我不知道我怎么可能这样做
答案 0 :(得分:1)
从?options
开始(向下滚动很长的路查找warn
...):
设置警告消息的处理。如果警告是否定的全部 警告被忽略。如果warn为零(默认值)警告 存储直到顶级函数返回。如果10或更少的警告 发出信号说明他们将被打印,否则会有一条消息说明如何 许多人都发出了信号。创建了一个名为last.warning的对象,可以 通过功能警告打印。如果警告是一个,警告是 在它们出现时打印。如果警告是两个或更大,则所有警告都是 变成了错误。
因此,使用tryCatch
,您可以指定一个warning
处理程序函数,以便在收到警告时执行操作:
> tryCatch(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},
warning = function(e) "Caught warning")
[1] "Caught warning"
或者您可以将所有警告设置为通过以下方式升级为错误:
options(warn = 2)
如文档中所述。然后,
> tryCatch(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},
error = function(e) "Caught error")
[1] "Caught error"
虽然很多人似乎更喜欢tryCatch
,但我经常喜欢try
的明确性,如果我想在运行表达式之后执行某种if...else
块,这对我来说会更容易:
options(warn = 2)
attempt <- try(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},silent = TRUE)
> class(attempt)
[1] "try-error"
那么您可以在class(attempt)
语句中检查if
(首选方法是检查inherits(attempt,"try-error")
)并相应地填写内容。