2016-04-08 10 views
0

Ich versuche zu verstehen, die Arbeit von for-Schleife für einen Vektor in R. Ich habe die Lösung für mein Problem, aber mit einem Zweifel über seine grundlegende Arbeit.Wie funktioniert die For-Schleife für einen Vektor in R?

Bei der Erstellung einer Funktion stieß ich auf dieses Problem. Das Problem ist, dass die for-Schleife die Elemente des Vektors durchläuft, aber bis zu einem bestimmten Index.

## the output is partially complete, seems like it didn't loop through all the values however the loop counter is perfect 
temp_vector<- c(1, NA,Inf, NaN,3,2,4,6,4,6,7,3,2,5,NaN, NA, 3,3,NaN, Inf, Inf, NaN, NA, 3,5,6,7) 
ctr<- 0 
for(i in temp_vector){ 

    temp_vector[i]<- ifelse((!is.na(temp_vector[i])) & (!is.infinite(temp_vector[i])), temp_vector[i], 0 ) 
    ## replace the element of vector by 0 if they are Inf or NA or NaN 
    ctr<- ctr+1 
} 
temp_vector 
print(ctr) 

# output 
> temp_vector 
[1] 1 0 0 0 3 2 4 6 4 6 7 3 2 5 NaN NA 3 3 NaN Inf Inf NaN NA 3 5 6 7 
> print(ctr) 
[1] 27 

## this is generating correct output 
temp_vector<- c(1, NA,Inf, NaN,3,2,4,6,4,6,7,3,2,5,NaN, NA, 3,3,NaN, Inf, Inf, NaN, NA, 3,5,6,7) 
for(i in 1:length(temp_vector)){ 

    temp_vector[i]<- ifelse((!is.na(temp_vector[i])) & (!is.infinite(temp_vector[i])), temp_vector[i], 0 ) 
    ## replace the element of vector by 0 if they are Inf or NA or NaN 
} 
temp_vector 

# output 
> temp_vector 
[1] 1 0 0 0 3 2 4 6 4 6 7 3 2 5 0 0 3 3 0 0 0 0 0 3 5 6 7 

Im Folgenden sind einige Varianten für Schleifen, die ich versuchte, die unterschiedlichen Ausgänge erzeugen, ich versuche zu verstehen, wie es funktioniert im Grunde. Es wäre hilfreich, wenn Sie etwas Licht darauf werfen könnten. Vielen Dank!

## variant-0 
y <- c(2,5,3,9,8,11,6) 
count <- 0 
for (val in y) { 
    if(val %% 2 == 0) 
    count = count+1 
} 
print(count) 

# output 
[1] 3 

## variant-1 
x<- c(2,4,6,4,6,7,3,2,5,6) 
for(i in x){ 

    x[i]<- ifelse(x[i]==6, NaN, x[i]) 
} 
x 

# output, Last element of the vector is not a NaN 
[1] 2 4 NaN 4 NaN 7 3 2 5 6 



## variant-2 
x<- c(2,4,6,4,6,7,3,2,5,6) 
ctr<- 0 
for(i in x){ 

    x[i]<- ifelse(x[i]==6, NaN, x[i]) 
    ctr<- ctr+1 
} 
x 
print(ctr) 

# output, Note: Last element of the vector is not a NaN 
> x 
[1] 2 4 NaN 4 NaN 7 3 2 5 6 
> print(ctr) 
[1] 10 



## variant-3 
x<- c(2,4,6,4,6,7,3,2,5,6) 
ctr<- 0 
for(i in x){ 

    x[ctr]<- ifelse(x[ctr]==6, NaN, x[ctr]) 
    ctr<- ctr+1 
} 
x 
print(ctr) 


# output. Note: the counter is perfect 
> x 
[1] 2 4 NaN 4 NaN 7 3 2 5 6 
> print(ctr) 
[1] 10 


## variant-4 
x<- c(2,4,6,4,6,7,3,2,5,6) 
ctr<- 0 
for(i in x){ 

    i<- ifelse(i==6, NaN, i) 
    ctr<- ctr+1 
} 
x 
print(ctr) 

# output 
> x 
[1] 2 4 6 4 6 7 3 2 5 6 
> print(ctr) 
[1] 10 

Antwort

2

Betrachten Sie das folgende Beispiel:

> y <- c(2, 5, 3, 9, 8, 11, 6) 

for Schleifen über den Vektor Sie. Im ersten Fall iterieren Sie über die Elemente des Vektors y:

> for (val in y) { 
+  print(val) 
+ } 
[1] 2 
[1] 5 
[1] 3 
[1] 9 
[1] 8 
[1] 11 
[1] 6 

Im zweiten Fall, dass Sie über die Elemente des Vektors 1:length(y), was bedeutet, c(1, 2, 3, 4, 5, 6, 7) iterieren:

> for (val in 1:length(y)) { 
+  print(val) 
+ } 
[1] 1 
[1] 2 
[1] 3 
[1] 4 
[1] 5 
[1] 6 
[1] 7 

Du hast diese gemischt in Dein Code oben. Hoffe das klärt die Dinge auf!

+0

, dass ein gültiges Konzept ist und ich weiß, Dies, aber ein Problem, wenn Sie die ersten zwei Chunks ausführen, ist es nicht durch alle Elemente im ersten Teil, aber funktioniert gut bis zu einem bestimmten Index dafür. – freetiger

+0

Ihre erste Schleife 'for (i in temp_vector)' führt eine Schleife über die Elemente des Vektors 'temp_vector'. Sie verwenden dann "i", um auf Teile Ihres Vektors zuzugreifen, z. hier '! is.na (temp_vector [i])'. In der ersten Iteration ist alles in Ordnung, weil "i = 1", aber in der zweiten Iteration "i = NA" und Sie verwenden "i" mehrmals, um auf Teile Ihres Vektors zuzugreifen, sollten Sie stattdessen den entsprechenden Index verwenden. – rhole

+0

das ist richtig! Vielen Dank! Akzeptiert! – freetiger

0

Die for-Schleife, die nachweislich funktioniert auf diese Weise verwenden

Das ist normal Definitionsteil

y <- c(2,5,3,9,8,11,6) 
count <- 0 

hier (ich werde die erste Variante dh varianten 0 dauern), wo das Unternehmen beginnt :

for (val in y) 

Hier wird val Werte des Vektors y enthalten, die sich bei jeder Iteration ändern.

Zum Beispiel:

val for iteration 1: 2; 
val for iteration 2: 5; 
val for iteration 3: 3; 

und so weiter.

{ 
    if(val %% 2 == 0) 
    count = count+1 
} 
print(count) 

So, hier wird Zähler erhöht werden, wenn val auch für Iteration dh: 1,5,7

also Wert von count ist 3.