2015-12-07 4 views
-3

J'ai une boucle qui fonctionne bien, mais la sortie n'est renvoyée que dans la console, la donnée n'est pas modifiée.La boucle ne change pas les valeurs dans la trame - R

  • une fin de la boucle de la tête (données) est renvoyée dans la console, produisant les valeurs attendues dans la colonne prévue
  • cependant, ce n'est pas changé dans la trame de données d'origine, où je veux les valeurs apparaître (impression de la tête (données) me donne maintenant les valeurs d'origine, et non pas les nouvelles créées par la boucle)

Exemple de code:

df <- cbind(x,y) 
myfun <- function(z){ 
    counter <- 0 
    for (i in 1:z) { 
    counter <- 1 + counter 
     for (j in 1:5) { 
     counter <- 1 + counter 
      if (condition_a){ 
       df[counter,2] <- 0 
      } 
      if (condition_b){ 
       df[counter,2] <- 1 
      } 
     } 
    } 
    return(head(df)) 
    newdf <- df[,2] 
} 

Qu'est-ce que je manque?

Les valeurs sont de classe int, cela devrait-il être le cas?

+2

Veuillez fournir un exemple reproductible. Voir [demander] – Cath

+0

vous êtes léger sur les détails .. besoin d'inclure un exemple reproductible et votre code. – MLavoie

+1

Veuillez ajouter vos ensembles de données, expliquer ce que vous essayez de faire et fournir la sortie désirée. Nous pourrions fermer ceci en résolvant votre problème local en disant d'utiliser quelque chose comme '<< -', mais je crois que toute votre approche est incorrecte et cela pourrait être résolu beaucoup plus facilement sans toutes ces boucles inutiles et certainement sans utiliser << - –

Répondre

0

Si vous voulez vraiment changer quelque chose en dehors d'une fonction alors vous pouvez utiliser df[counter,2] <<- 1 qui va changer la valeur de df en dehors de votre fonction.

Cependant, ce n'est pas une bonne pratique car chaque fois que vous exécutez la fonction, vous finirez avec un changement dans votre df trame de données. Au lieu de regarder les valeurs de retour. En outre, vous pouvez probablement effectuer une certaine simplification à la place de vos boucles pour accélérer l'exécution de votre code. J'ai joint un exemple pour vous montrer comment vous feriez ce que vous vouliez faire de toute façon.

x <- c(0, 1, 2, 3) 
y <- c(0, 1, 2, 3) 

df <- data.frame(x, y)  

a<-function(){ 
df[,2] <<- c(0, 0, 0, 0) 
} 

b<-function(){ 
    df[,2] <- c(0, 0, 0, 0) 
} 

b() 

df 

a() 

df 
+0

Merci, ça a vraiment marché! – Emm