2012-01-03 71 views
2

我無法做IF對象的比較。當我將它們與數值進行比較時,IF工作,例如:if (c1 < c2){do something}失敗if (c1 < 0){do something}工作。如果陳述在R

這是我正在使用的代碼,它顯示錯誤,其中HighValues是一個數字列表,LowValue也是一個數字列表。我做的比較錯了嗎?

checkHS<-function(HighValues,LowValues) 
{ 
    counter<-1 
    patternList<-c() 

    while(counter < length(HighValues)) 
    { 
    cmpValue1<- 0.15*HighValues[[counter]] 
    cmpValue2<- HighValues[[counter+1]] 
    if(cmpValue1<cmpValue2) 
    patternList<-c(patternList,counter) 
    counter<-counter+1 

    } 
    return (patternList) 
} 

我在做什麼錯?

編輯:添加一個數據集,我傳遞給函數以獲得更多的清晰度。

HighValues<-c(1:100)

LowValues<-c(2:101)

+1

HighValues對象的類型是什麼?爲什麼你通過LowValues呢?你是否希望櫃檯有條件地或每次增加?這是非常不明確的代碼......就意圖而言。順便說一句,你的例子行應該工作正常...你是什麼意思的「不工作」?如果你將c1和c2設置爲行,他們應該做的事情。一旦你清楚這一點,你應該得到一些很好的R代碼,看起來不像你有什麼。你這樣做的方式效率很低,而且非R型。 – John 2012-01-03 06:31:31

+0

HighValues對象是列表類型,計數器每次增量與條件無關,LowValues是第二個如果我沒有在這裏添加條件,上面的代碼生成** True/False未找到錯誤**。我確實嘗試設置c1和c2,但它不起作用。我仍然想知道爲什麼。 – 2012-01-03 06:36:36

+0

你可以發佈一個你傳遞給函數的數據類型的小例子嗎? – 2012-01-03 06:41:01

回答

2

當我運行與您提供的數據的功能,它的計算結果完成毫無怨言,只返回值,它應該:

head(checkHS(HighValues=HighValues, LowValues=LowValues)) 
[1] 1 2 3 4 5 6 

這就是說,下面的代碼做與您發佈的功能相同。它利用了R的「矢量化」計算能力,使代碼更具表現力,更易於閱讀。

checkHS2 <- function(HighValues,LowValues) { 
    cmpValue1 <- 0.15*HighValues[-length(HighValues)] 
    cmpValue2 <- HighValues[-1] 
    which(cmpValue1 < cmpValue2) 
} 
+0

謝謝大家,想通了出路,力求使用,但絕對使用邏輯清楚。 再次感謝。 – 2012-01-03 08:35:24

-2

回答你的問題的關鍵是:「你期待什麼結果?」

當我運行你的代碼時,我沒有發現它裏面有任何錯誤,函數返回值。

+0

它返回真/假的預期。 – 2012-01-03 10:19:24