2016-11-26 5 views
-1

In diesem Stück Code:Warum erscheint dieser if/else Fehler im Skript, aber nicht in der Konsole?

q7 <- function (x) { 
    if (is.numeric (x) == FALSE) {stop ("Input is non-numeric.")} 
    if (all (x > 0) == FALSE) {stop ("Input has negative values.")} 
    sum <- 0 
    while (sum <= 100) { 
    if (x[1] > 50) {next} 
    else if (x[1] %% 2 == 0) {sum <- sum + (x[1]/2)} 
    else {sum <- sum + x[1]} 
    x <- x [x[2]:length (x)] 
    } 
} 

zum Beispiel verwendet als q7 (c(10,20,30,40,50,60,70,80,90,100)), bekomme ich diesen Fehler:

Error in if (x[1] > 50) { : missing value where TRUE/FALSE needed 

Ich denke, hier die Bedingung könnte nicht einfacher sein, und ich muss einige R fehlt Heuristik, weil offensichtlich in der Konsole;

> x <- c(10,20,30,40,50,60,70,80,90,100) 
> x[1] > 50 
[1] FALSE 

So einfach.
Was ist los?

+0

Ich möchte den ersten Wert in 'x' in jeder Iteration weglassen, gibt es einen Weg, der nicht alles durcheinander bringen würde? –

+0

Natürlich ist mir das entgangen. Vielen Dank! –

Antwort

0

Eine schnelle Diagnose mit debug zeigt das Problem mit

ist
x <- x[x[2]:length(x)] 

Nach der ersten Iteration dies ein Vektor von NA sein wird. Dann, in der nächsten Iteration, wenn Sie x[1] > 50 überprüfen, tun Sie tatsächlich NA > 50, so erhalten Sie den Fehler.

Nach der Überprüfung möchten Sie einfach den ersten Wert von x entfernen. Warum also nicht

verwenden
x <- x[-1] 
0

Das Ändern von x [2] auf nur 2 wird es tun.

x <- x [2:length (x)] 

Wegen der ‚next‘ Aussage, die Sie mit einer Endlosschleife enden werden, da von x [1] 60 vorwärts =, wird es auf die nächste Iteration der while-Schleife in Bewegung bleiben (für immer). Vielleicht wollten Sie "Pause" verwenden.

Verwandte Themen