Fehler… fehlender Wert, wo TRUE / FALSE benötigt wird

Sep 17 2020

Ich habe versucht, einen Code zum Sortieren eines Vektors in R zu schreiben, erhalte jedoch immer wieder die folgende Fehlermeldung: Error in if (data[j] < data[k]) { : missing value where TRUE/FALSE needed

Dies ist meine bisherige Sortierfunktion:

sortscore <- function(data){
   new <- 0
   x <- data
  
   for (i in 1:length(data)){
      new[i] <- minscore(x)
      x <- x[x!=minscore(x)]
      x
   }
   new
}

Dies ist die Minscore-Funktion:

minscore <- function(data){
  j <- 1;k <- j+1; min <- 0
  repeat {
    if(data[j]<data[k]){
      min <- data[j]
      k <- k+1
    }
    else{
      min <- data[k]
      j <- k
      k <- k+1
    }
    if(k==length(data)+1) break
  }
  return(min)
}

Ich kann die length()Funktion nur für eine eingebaute Funktion verwenden, daher ist eine Sortierfunktion erforderlich. Bitte helfen Sie mir zu verstehen.

Antworten

AllanCameron Sep 17 2020 at 15:23

Das Problem ist, dass Ihre sortscoreFunktion xbei jeder Iteration um eins kleiner wird, was bedeutet, dass sie bei der letzten Iteration nur eine einzige Zahl enthält. Sie rufen die minscoreFunktion daher unter einer einzigen Nummer auf.

Der Test im if(data[j]<data[k])Inneren minscorebenötigt mindestens zwei Zahlen, um zu funktionieren, sonst wird ein Fehler ausgegeben, da kimmer 1 höher als ist j. data[2]existiert nicht, wenn dataLänge 1 ist.

Die einfache Lösung besteht darin, dass datadie minscoreFunktion die Länge 1 unverändert zurückgibt.

Wenn wir also Ihre Funktion ändern in:

minscore <- function(data){
  
  if(length(data) == 1) return(data)
  
  j <- 1;k <- j+1; min <- 0
  repeat {
    if(data[j]<data[k]){
      min <- data[j]
      k <- k+1
    }
    else{
      min <- data[k]
      j <- k
      k <- k+1
    }
    if(k==length(data)+1) break
  }
  return(min)
}

Dann sollten wir eine funktionierende Sortierfunktion bekommen:

x <- sample(20)
x
#> [1]  8 14 11 19 20  2  3 10  1 15  4 17  6 16  7  5 13 12 18  9

sortscore(x)
#> [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

Nett.