/ / Wie funktioniert die Schleife für einen Vektor in R? - r, for-loop, Vektor

Wie funktioniert die for-Schleife für einen Vektor in R? - r, for-Schleife, Vektor

Ich versuche, die Funktionsweise von for-Schleife für einen Vektor in R zu verstehen. Ich habe die Lösung für mein Problem herausgefunden, habe aber Zweifel an seiner grundlegenden Funktionsweise.

Bei der Erstellung einer Funktion bin ich auf dieses Problem gestoßen. Das Problem ist, dass die for-Schleife die Elemente des Vektors durchläuft, jedoch 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

Nachfolgend einige Varianten von for-Schleifen, die ich ausprobiert habe, um unterschiedliche Ausgaben zu erzeugen. Ich versuche zu verstehen, wie es im Grunde funktioniert. 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

Antworten:

2 für die Antwort № 1

Betrachten Sie das folgende Beispiel:

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

for Schleifen über dem Vektor, den Sie bereitstellen. Im ersten Fall durchlaufen Sie 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 iterieren Sie über die Elemente des Vektors 1:length(y), Bedeutung c(1, 2, 3, 4, 5, 6, 7):

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

Sie haben dies in Ihrem Code oben gemischt. Hoffe das klärt die Dinge!


0 für die Antwort № 2

Die for-Schleife, die Sie verwenden, funktioniert auf diese Weise (Ich werde die erste Variante, d. H. Die Variante-0, aufnehmen)

Dies ist ein normaler Definitionsteil

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

Hier beginnt das Geschäft:

for (val in y)

Hier enthält val Werte des Vektors y, die sich in jeder Iteration ändern.

Beispielsweise:

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)

Hier wird also die Zählung erhöht, wenn val gerade ist, d. H. Für die Iteration: 1,5,7

Der Wert von count ist also 3.