2012-11-16 39 views
4

我正在寫一個函數,它使用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引發錯誤。我嘗試了一堆變體無濟於事。我在想什麼,在這裏?

回答

8

如果您在binning看我想你會發現,「警告」你看是不是通過warning()cat(),這就是爲什麼tryCatch不撿起來產生。 binning的作者可能值得爲這種疏忽配備一些溼麪條。 ;)(或者它可能是有意的,由於特定的方式,撥浪鼓的作品,我不知道)

它發生這種情況時,似乎返回NULL,所以你可以簡單地手動處理它。不理想,但可能是唯一的出路。

+0

我真的希望事實並非如此,但我認爲你是對的......我想我只是想知道「訂單」拋出的錯誤。 –

+0

@AndrewSannier如果只有當你傳遞的向量只有一個唯一值時纔會發生這種情況,我可能會在進入'btsKmeanBin'後立即檢查它,並且有一個處理這種情況的'if'分支。 – joran

+0

我在想,但我不確定它會是唯一的情況。我可以想象出一些其他情況會對kmeans算法產生問題......通過處理「order」錯誤,我可能會獲得大部分......至少那些導致「NULL」返回的錯誤。 –