Initialisation de variables avant leur utilisation

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Initialisation de variables avant leur utilisation

Messagepar Abdel Zine » 06 Fév 2007, 17:24

Soit la fonction suivante tirée du doc de Pr. Besse : 3fonctions_R :
> ex.vect
function(x,y,z,t){
# les arguments sont des vecteurs de longueur 5
# init les vecteur prd et div :
prd <-rep(0,5) # init de la variable
div <-rep(0,5) # init de la variable
for(i in 1:5)
{
prd[i] <- x[i] * y[i]
div[i] <- z[i] / t[i]
}
return(prd+div)
}
Comme on ne « déclare » par les variables et leurs types sous R, pour les vecteurs prd et div par exemple, est ce qu’on est obligé de les initialiser avec des valeurs aléatoires (ici des 0) afin qu’ils soient reconnus (comme vecteurs) par l’interpréteur ? y a-t-il une autre manière de procéder ?
Merci
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.

ceragem

agdgdfg

Messagepar ceragem » 06 Fév 2007, 17:49

Il y avait des liens suspects, je me suis permis de tt supprimer

Logez Maxime
Messages : 3154
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 06 Fév 2007, 19:42

Bonjour,


Une autre façon de faire serait de les déclarer NULL au départ comme ça tu crées des contenus vides que tu remplies au fur et a mesure ce qui fait que tu n'as pas besoin par exemple de spécifier leur taille au départ (ce qui est équivalent je viens de voir avec le post précédent), mais de toute façon au départ il te faut un objet qui va recevoir le résultat de tes itérations.

Code : Tout sélectionner

ex.vect <-
function(x,y,z,t){
# les arguments sont des vecteurs de longueur 5
# init les vecteur prd et div :
prd <- NULL # init de la variable
div <- NULL # init de la variable
for(i in 1:5)
{
prd[i] <- x[i] * y[i] # j'avais oublié le [i]
div[i]<- z[i] / t[i]
}
return(prd+div)
}

L'intérêt de les déclarer NULL c'est que ton objet peut devenir un vecteur comme dans ton exemple, ou une matrice ....

Maxime

Logez Maxime
Messages : 3154
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 07 Fév 2007, 07:52

Bonjour,



Juste un petit complément et une remarque. Si tu ne crées pas des objets au départ pour stocker les résultats des itérations, le résultat de ta boucle sera un message d'erreur : "Erreur dans prd[i] <- x[i] * y[i] : objet "prd" non trouvé". De plus ici la fonction en elle même n'a pas vraiment de sens (a part de servir d'exemple) car tu peux faire l'opération en une seule fois sans passer par une boucle :

Code : Tout sélectionner

x <- rnorm(5)
y <- rnorm(5)
z <- rnorm(5)
t <- rnorm(5)
ex.vect(x,y,z,t)
[1]  1.63705366  0.07240548  1.83470515 -0.59202192 -1.26080110
(x*y)+(z/t)
[1]  1.63705366  0.07240548  1.83470515 -0.59202192 -1.26080110


Maxime

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Messagepar Abdel Zine » 07 Fév 2007, 12:08

@E.V. Dennst : pour M = matrix(0, 1000, 1000) ça me donne :
[ reached getOption("max.print") -- omitted 901 rows ]]
bravo !

Je suppose que le type « d’entiers » par défaut dans matrix(0, 1000, 1000) c’est « double » (donc un réel à la base) ?
Par quelle commande je pourrais demande le type de l’objet M (pas forcément une matrice)? (Je connais les instructions is.type() mais celles-ci vérifient le type elles ne le donnent pas)

Maxime, j’ai bien noté avec prd et div initialisés à Null que
prd <- x[i] * y[i]
div[i]<- z[i] / t[i]
ne pose aucun problème.

Si tu ne crées pas des objets au départ pour stocker les résultats des itérations, le résultat de ta boucle sera un message d'erreur : "Erreur dans prd[i] <- x[i] * y[i] : objet "prd" non trouvé".
>> oui je le sais, puisque j’avais essayé
c’était implicite dans ma question ("est ce qu’on est obligé de les initialiser avec des valeurs aléatoires (ici des 0) afn qu’ils soient reconnu (comme vecteurs) par l’interpréteur ?")

tu peux faire l'opération en une seule fois sans passer par une boucle
>> Effectivement je me rends compte depuis que j’ai commencé l’apprentissage de R que le langage est très très souple, mais d’autre part ceci entraîne une ambiguïté pour le type de variables, du moins pour quelqu’un comme moi qui a l’habitude d’utiliser des langages fortement typés où le paradigme est différent.

Très instructif vos exemples merci !

PS :
@ Dennst : tu fais une formation en économie ? : )
je t’aurais bien envoyé de la RAM mais déjà que j’en manque moi-même, cela dit j’ai des barrettes de et 64 Mo d’un ancien x86 si tu es intéressé c’est avec plaisir :D
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.

Logez Maxime
Messages : 3154
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 07 Fév 2007, 13:08

Bonjour,

@E.V. Dennst : pour M = matrix(0, 1000, 1000) ça me donne :
[ reached getOption("max.print") -- omitted 901 rows ]]
bravo !

Si tu veux en afficher plus il te faut modifier le paramèter max.print de options qui par défaut est de 99999, d'ou les 901 lignes qui ne sont pas afficher.

Je suppose que le type « d’entiers » par défaut dans matrix(0, 1000, 1000) c’est « double » (donc un réel à la base) ?
Par quelle commande je pourrais demande le type de l’objet M (pas forcément une matrice)? (Je connais les instructions is.type() mais celles-ci vérifient le type elles ne le donnent pas)

La je te conseille de regarder les fonctions class, mode et storage.mode. Quand tu fais storage.mode(M) la réponse est bien double.

En espérant avoir aidé.

Maxime

E.V. Dennst

Messagepar E.V. Dennst » 07 Fév 2007, 13:24

Abdel Zine a écrit :Je suppose que le type « d’entiers » par défaut dans matrix(0, 1000, 1000) c’est « double » (donc un réel à la base) ?

Pratiquement c'est ce qu'on constate.
Je crois l'avoir aussi lu qq part, mais je ne saurais plus où.
Par défaut, c'est tarif max, ie double.

Abdel Zine a écrit :Par quelle commande je pourrais demande le type de l’objet M ?

Je ne sais pas et serais aussi intéressé par la réponse.
J'ai l'impression qu'on ne peut pas avoir moins que integer (4 octets), mais je serais heureux d'être contredit.

Code : Tout sélectionner

> M = matrix(as.character('a'),1000,1000)
> object.size(M)
[1] 4000156

> M = matrix(as.logical(0),1000,1000)
> object.size(M)
[1] 4000120

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Messagepar Abdel Zine » 09 Fév 2007, 21:53

Bonsoir,
Petite faute de frappe dans ma question, je voulais dire :
Par quelle commande je pourrais demander le type de l’objet M ?

Merci pour toutes les précisions, je vais encore chercher dans la doc si je trouve quelque chose
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.

Ambien premium

Ambien premium

Messagepar Ambien premium » 10 Fév 2007, 08:13

Hi! <a href= http://zacefronforum.com/forums/viewtop ... pic=ambien >ambien</a> ambien mylastcheck7 Welcome!

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Messagepar Abdel Zine » 10 Fév 2007, 09:20

Code : Tout sélectionner

> mode(M)
[1] "numeric"
> typeof(M)
[1] "double"
> storage.mode(M)
[1] "double"
> class(M)
[1] "matrix"
Parfait !
Merci.
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité