我正在寫一個函數,它使用kmeans來確定bin寬度以將連續測量(預測概率)轉換爲整數(3個bin中的一個)。我偶然發現了一個邊界情況,在這個情況下,我的算法可以(正確)預測整個集合的相同概率,並且我想處理這種情況。我使用的是rattle
包的binning()
功能以下列方式:tryCatch()顯然忽略了一個警告
btsKmeansBin <- function(x, k = 3, default = c(0, 0.3, 0.5, 1)) {
result <- binning(x, bins = k, method = "kmeans", ordered = T)
bins <- attr(result, "breaks")
attr(bins, "names") <- NULL
bins <- bins[order(bins)]
bins[1] <- 0
bins[length(bins)] <- 1
return(bins)
}
運行在x <- c(.5,.5,.5,.5,.5,.5)
這個功能,你會得到在order(bins)
一步一個錯誤,因爲bins
將是NULL,因此不是一個載體。
顯然,如果x
只有一個不同的值,kmeans不應該工作。在這種情況下,我想返回default
bin分部。發生這種情況時,binning
問題「警告:該變量未被考慮。」所以我想用tryCatch
來處理這個警告,但是,圍繞着下面的代碼result <- ...
行不工作,我所期望的方式:
...
tryCatch({
result <- binning(x, bins = k, method = "kmeans", ordered = T)
}, warning = function(w) {
warn(sprintf("%s. Using default values", w))
return(default)
}, error = function(e) {
stop(e)
})
...
警告被打印成雖然我沒有使用過tryCatch
,並且代碼超過return
語句並再次從order
引發錯誤。我嘗試了一堆變體無濟於事。我在想什麼,在這裏?
我真的希望事實並非如此,但我認爲你是對的......我想我只是想知道「訂單」拋出的錯誤。 –
@AndrewSannier如果只有當你傳遞的向量只有一個唯一值時纔會發生這種情況,我可能會在進入'btsKmeanBin'後立即檢查它,並且有一個處理這種情況的'if'分支。 – joran
我在想,但我不確定它會是唯一的情況。我可以想象出一些其他情況會對kmeans算法產生問題......通過處理「order」錯誤,我可能會獲得大部分......至少那些導致「NULL」返回的錯誤。 –