2016-04-09 4 views
0

Ich habe den folgenden Code:Befund Index der Pause in if-Anweisung in einer Schleife in R

test<-function(x) { 

      for (i in 2:100){ 
      b<-matrix(1,nrow=5,ncol=100) 
      b[,i]<-t(x) %*% d[,i-1]   ##x and d are a matrix and vector (not important for this example) 
      ifelse(sum(b[,i] - b[i-1]) < 0.0001,break,next) 
     } 
return(element of b where break occured) 
    } 

Die Schleife mir geben wird, zum Beispiel in einem Fall hatte ich:

> b 
[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8] 
[1,] 1 1.7061460 1.7034962 1.6965905 1.6933022 1.6920115 1.6915324 1.6913578 
[2,] 1 0.8019685 0.8041003 0.8035683 0.8031706 0.8029962 0.8029287 0.8029037 
[3,] 1 1.1378250 1.1467192 1.1569280 1.1615270 1.1633061 1.1639635 1.1642026 
[4,] 1 0.9092191 0.9516261 0.9624585 0.9657958 0.9669282 0.9673277 0.9674706 
[5,] 1 0.4448414 0.4201246 0.4135832 0.4115113 0.4108015 0.4105505 0.4104607 
      [,9]  [,10]  [,11]  [,12]  [,13] [,14] [,15] [,16] [,17] 
[1,] 1.6912947 1.6912718 1.6912636 1.6912607 1.6912596  1  1  1  1 
[2,] 0.8028946 0.8028913 0.8028901 0.8028897 0.8028895  1  1  1  1 
[3,] 1.1642891 1.1643203 1.1643316 1.1643356 1.1643371  1  1  1  1 
[4,] 0.9675220 0.9675405 0.9675472 0.9675496 0.9675504  1  1  1  1 
[5,] 0.4104284 0.4104168 0.4104126 0.4104110 0.4104105  1  1  1  1 
    [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] 
[1,]  1  1  1  1  1  1  1  1  1  1  1  1 
[2,]  1  1  1  1  1  1  1  1  1  1  1  1 
[3,]  1  1  1  1  1  1  1  1  1  1  1  1 
[4,]  1  1  1  1  1  1  1  1  1  1  1  1 
[5,]  1  1  1  1  1  1  1  1  1  1  1  1 

Ich möchte, dass die Funktion den letzten Wert zurückgibt, bevor der Bruch auftritt, in diesem Fall würde ich wollen, dass es die 13. Spalte von b zurückgibt (dies ändert sich von Eingabe zu Eingabe), ich bin nicht ganz sicher, wie der Index der Pause

erhalten
+1

ifelse Funktion sollte nicht für Steuerstrom verwendet werden (es mir selbst fremd scheint, dass es funktioniert!), Sollten Sie ' if (Summe (b [, i] - b [i-1]) <0,0001) {brich} ' – digEmAll

+0

@digEmAll danke, könntest du ein bisschen mehr erklären, warum es nicht gut ist? auch irgendwelche Gedanken darüber, wie man den Index findet, bei dem der Bruch auftritt? – dimebucker91

+1

Der Zweck von ifelse besteht darin, eine Bedingung für jedes Element eines Vektors auszuwerten und den ersten Wert für die Elemente zurückzugeben, bei denen die Bedingung wahr ist, und den zweiten Wert für die Elemente, bei denen die Bedingung falsch ist. If-Anweisung Zweck ist stattdessen, was Sie wollen, um den Fluss Ihrer Schleife zu steuern, und im Falle Ihrer Bedingung wird überprüft, um die Schleife zu stoppen. – digEmAll

Antwort

2

Sie würden ifelse() Funktion if und else Blocks von Zerschlagung Ihr wahrscheinlich profitieren:

test<-function(x) { 

    for (i in 2:100){ 
    b<-matrix(1,nrow=5,ncol=100) 
    b[,i]<-t(x) %*% d[,i-1] 
    # test for condition 
    if(sum(b[,i] - b[,i-1]) < 0.0001) return(i) 
    else next 
    # if condition never occurs, return NA 
    return(NA) 
    } 
}