[réglé] probleme d'assignation

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

francois guilhaumon
Messages : 14
Enregistré le : 27 Mar 2007, 08:51
Contact :

[réglé] probleme d'assignation

Messagepar francois guilhaumon » 17 Avr 2007, 14:32

Bonjour a tous,

J'ai un probleme d'assignation :

j'ai créer plusieurs tableaux a 3 dimensions dont le nom est une composition des chaines "sst", un iterateur et "_3D", je souhaite assigner à la tranche j d'un de ces tableaux un autre tableau. J'obtient un message d'erreur que je n'ai encore jamais rencontré. En debuggant la ligne je verifie que l'objet a gauche du symbole d'assignation existe bien, deplus il a exactement les memes dimensions que celui a droite (qui existe bien entendu) :

Code : Tout sélectionner

eval(parse(text=paste("sst",i,"_3D",sep="")))[,,j] <- subset( eval(parse(text=datName)),substr(eval(parse(text=datName))$Time,1,3)==months[j])

Erreur dans eval(parse(text = paste("sst", i, "_3D", sep = "")))[, , j] <- subset(eval(parse(text = datName)),  :
        la cible de l'assignation est un objet n'appartenant pas au langage


Voila je suis assez perplexe et je ne vois pas comment contourner ce problème.

Merci par avance pour toute aide.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 17 Avr 2007, 18:31

Voir ?assign.

Renaud

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

Messagepar Logez Maxime » 17 Avr 2007, 18:40

Bonsoir,

Il est difficile de répondre à ta question sans avoir une petite idée de tes objets, pourrais tu mettre un exemple que l'on puisse regarder. Une question qui ne mange pas de pain est-ce que tes j et tes i sont bien définis ? Ne manque t'il pas des "" pour entourer datName ? Il semble que le résultat ne soit pas le même si tu tapes eval(parse(text=x)) que si tu tapes eval(parse(text="x")), dans le premier cas tu as la dernière valeur de l'objet x et dans le deuxième cas tu as bien l'objet x tout entier.

Maxime

francois guilhaumon
Messages : 14
Enregistré le : 27 Mar 2007, 08:51
Contact :

Messagepar francois guilhaumon » 18 Avr 2007, 07:07

merci pour vos reponse.

@Renaud : je connais assign.

@les autres : voici mon code en entier (j'ai des fichiers de temperature sur une grille par année (1982 -> 2006) je souhaite transformer ces tableaux en array a 3D pour faire des oprerations dans la "profondeur" du array.

J'ai aussi essayé abind mais sans succès.

Code : Tout sélectionner


months = c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")

for (i in 1982:2006) {

datName = paste("sst",i,sep="")

assign( paste("sst",i,"_3D",sep="") , array(NA,c(748,4,12)) )

for (j in 1:12) {


 eval(parse(text=paste("sst",i,"_3D",sep="")))[,,j] <- subset( eval(parse(text=datName)),substr(eval(parse(text=datName))$Time,1,3)==months[j])

}#end of for j
}#end of for i


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

Messagepar Logez Maxime » 18 Avr 2007, 08:33

Bonjour,

L'erreur vient du fait que lorsque tu fais eval(parse(text=paste("sst",i,"_3D",sep="")))[,,j] il te renvoie bien le tableau mais pas l'objet en question donc tu ne peux le modifier l'objet de cette manière. Je peux me tromper mais c'est comme si tu tapais rnorm(100) pour avoir un vecteur de 100 valeurs aléatoires selon une loi normale et que tu voulais en modifier la deuxième valeur, tu ne peux le faire que si tu as stocké ce rnorm dans un vecteur :

Code : Tout sélectionner

rnorm(100)[2]<-10 # ça n'a pas de sens car le rnorm n'est stocké nul part
Erreur dans rnorm(100)[2] <- 10 : la cible de l'assignation est un objet n'appartenant pas au langage


Il te faut a mon avis tout mettre dans la chaîne de caractère de ton eval :

Code : Tout sélectionner

eval(parse(text=paste(paste("sst",i,"_3D",sep=""),"[,,",j,"] <- subset( eval(parse(text=datName)),substr(eval(parse(text=datName))$Time,1,3)==months[",j,"]",sep="")))

# de cette manière tu te retrouves avec un truc dans le genre a évaluer : i=10, j=3 dans l'exemple

paste(paste("sst",i,"_3D",sep=""),"[,,",j,"] <- subset( eval(parse(text=datName)),substr(eval(parse(text=datName))$Time,1,3)==months[",j,"])",sep="")
[1] "sst10_3D[,,3] <- subset( eval(parse(text=datName)),substr(eval(parse(text=datName))$Time,1,3)==months[3])"


Il faut que la chaîne de caractère dans ton eval lui donne toutes les instructions, essaie et tu verras si ça marche ou non.

Code : Tout sélectionner

# un exemple plus simple :
x <- matrix(0,10,10)
ted <- rnorm(100)
i <- 10
j <- 3

eval(parse(text=paste("x")))[i,j] <- ted[i*j] # selon ton code
Erreur dans eval(parse(text = paste("x")))[i, j] <- ted[i * j] :
        la cible de l'assignation est un objet n'appartenant pas au langage

paste("x[",i,",",j,"] <- ",paste("ted"),"[",i*j,"]",sep="") # la chaîne de caractère pour les instructions
[1] "x[10,3] <- ted[30]"

eval(parse(text=paste("x[",i,",",j,"] <- ",paste("ted"),"[",i*j,"]",sep="")))
x
      [,1] [,2]       [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    0  0.0000000    0    0    0    0    0    0     0
 [2,]    0    0  0.0000000    0    0    0    0    0    0     0
 [3,]    0    0  0.0000000    0    0    0    0    0    0     0
 [4,]    0    0  0.0000000    0    0    0    0    0    0     0
 [5,]    0    0  0.0000000    0    0    0    0    0    0     0
 [6,]    0    0  0.0000000    0    0    0    0    0    0     0
 [7,]    0    0  0.0000000    0    0    0    0    0    0     0
 [8,]    0    0  0.0000000    0    0    0    0    0    0     0
 [9,]    0    0  0.0000000    0    0    0    0    0    0     0
[10,]    0    0 -0.3004317    0    0    0    0    0    0     0

ted[30]
[1] -0.3004317


Maxime

francois guilhaumon
Messages : 14
Enregistré le : 27 Mar 2007, 08:51
Contact :

Messagepar francois guilhaumon » 18 Avr 2007, 08:50

merci bcp effectivement je vais faire evaluer l'ensemble de la commande.

francois guilhaumon
Messages : 14
Enregistré le : 27 Mar 2007, 08:51
Contact :

Messagepar francois guilhaumon » 18 Avr 2007, 09:10

J'ai suivi les instructions de Maxime et maintenant je peu evaluer correctement ma commande :

Code : Tout sélectionner


for (i in 1982:2006) {

datName = paste("sst",i,sep="")

assign( paste("sst",i,"_3D",sep="") , array(NA,c(748,4,12)) )

for (j in 1:12) {

eval( parse(text=paste("sst",i,"_3D","[,,",j,"] <- subset(",datName,",substr(",datName,"$Time,1,3)==months[",j,"])",sep="")))



}#end of for j
}#end of for i



le code suivant :

Code : Tout sélectionner

paste("sst",i,"_3D","[,,",j,"] <- subset(",datName,",substr(",datName,"$Time,1,3)==months[",j,"])",sep="")


me renvoi bien la chaine :

Code : Tout sélectionner

[1] "sst1982_3D[,,1] <- subset(sst1982,substr(sst1982$Time,1,3)==months[1])"


Mon problème maintenant est que cette comande me transforme le array sst1982_3D en vecteur de longueur 35904 (748*4*12) qui a comme classe "list" :

Code : Tout sélectionner

mode(sst1982_3D)
[1] "list"


Ce qui est etonnant c'est que l'objet qui doit remplacer sst1982_3d a la bonne dimension :

Code : Tout sélectionner

> dim(sst1982_3D[,,1])
[1] 748   4
> dim(subset(sst1982,substr(sst1982$Time,1,3)==months[1]))
[1] 748   4


Existe-t-il un moyen de forcer la dimension lors de l'assignation ?

Merci encore par avance.

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

Messagepar Logez Maxime » 18 Avr 2007, 09:30

Re,

Il peut peut être s'agir d'un problème de classe de tes objets d'un côté tu as un array mais de l'autre de quoi s'agit-il ? D'une matrice, d'un data frame ?, d'une liste ? S'il s'agit d'un data frame il te faudra d'abord le passé en matrice pour que ta structute soit conservée.

Code : Tout sélectionner

ted <- array(0,c(10,10,2))
bob <- data.frame(matrix(rnorm(100),10,10))
ted[,,1]<-bob
class(ted)
[1] "list"
ted <- array(0,c(10,10,2))
ted[,,1] <- as.matrix(bob)
class(ted)
[1] "array"
ted[1:3,1:3,]
, , 1

           [,1]       [,2]       [,3]
[1,] -0.0485894 -0.4158613  0.5094374
[2,]  1.2410364  1.5083240 -0.5572712
[3,]  1.1285976 -0.7110329 -0.4577446

, , 2

     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0

Maxime

francois guilhaumon
Messages : 14
Enregistré le : 27 Mar 2007, 08:51
Contact :

Messagepar francois guilhaumon » 18 Avr 2007, 12:18

MERCI !!!

Effectivement c'etait bien un problème de classe et la transformation du data.frame en matrix m'as permis de conserver la structure.

merci a tous (specialement à Maxime).


Retourner vers « Questions en cours »

Qui est en ligne

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