la cible de l'assignation est un objet n'appartenant pas au langage

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

herve chapuis
Messages : 115
Enregistré le : 05 Déc 2008, 15:26

la cible de l'assignation est un objet n'appartenant pas au langage

Messagepar herve chapuis » 21 Nov 2024, 15:14

Bonjour

J'utilise le package AlphasimR. Ce package crée des objets (des populations) avec différents attributs.
Jusqu'à la version 1.5 il fallait utiliser deux fonctions définies dans le package (setMisc() et getMisc() ) pour définir et accéder aux attributs complémentaires (miscelaneous information).

Maintenant les auteurs ont supprimé ces fonctions.

Auparavant

Code : Tout sélectionner

year = 0
founders = setMisc(x = founders,
node = "yearOfBirth",
value = year)
head(getMisc(x = founders, node = "yearOfBirth"))

permettait de renseigner l'attribut yearOfBirth de la population founders en lui attribuant la valeur year.

Désormais il faut suffit de taper les lignes suivantes pour arriver au même résultat.

Code : Tout sélectionner

year = 0

founders@misc$yearOfBirth =rep(year,nInd(founders))
head(founders@misc$yearOfBirth)

où nInd(founders) est le nombre d'individus de la population founders.

Maintenant je voudrais, dans une boucle, renseigner différentes familles.
Admettons que j'ai 9 familles distinctes, je voudrais créer des populations males1 à males9, et leur attribuer une famille d'origine.
Auparavant ce code fonctionnait:

Code : Tout sélectionner

   
   for (family in 1:9) {
   assign(paste0("males", family),setMisc(x = get(paste0("males", family)),
                                                    node ="Famille_Origine",
                                                    value = family))
                               }


maintenant je voudrais coder comme suit (répétable si vous chargez AlphaSimR):

Code : Tout sélectionner

# Load AlphaSimR
library(AlphaSimR)

rm(list = ls())
# Global simulation parameters & basePop
founderGenomes = quickHaplo(nInd = 81,
                            nChr = 20,
                            segSites = 100)

SP = SimParam$new(founderGenomes)
SP$setSexes("yes_sys")

basePop = newPop(founderGenomes)

#la population de base est créée.
#Je veux créer 9 sous-groupes (3 males et 6 femelles, soit 81 individus) et leur attribuer une caractéristique (la famille)

for (family in 1:9) {
  assign(paste("males", family, sep=""),basePop[(1:3)+9*(family-1)])
  assign(paste("females", family, sep=""),basePop[(4:9)+9*(family-1)])
 
  get(paste("males", family, sep=""))@misc$Famille_Origine = rep(family,nInd(get(paste("males", family, sep=""))))
}
}

et j'obtiens le code d'erreur

Code : Tout sélectionner

Erreur dans get(paste("males", family, sep = ""))@misc$Famille_Origine = rep(family,  :
  la cible de l'assignation est un objet n'appartenant pas au langage
.
Je refais tourner la boucle en commentant la dernière instruction. A l'issue de la boucle, family est égale à 9, et j'ai créé les sous populations males1 à males9 et females1 à females9. J'ai les valeurs suivantes :

Code : Tout sélectionner

> get(paste("males", family, sep=""))
An object of class "Pop"
Ploidy: 2
Individuals: 3
Chromosomes: 20
Loci: 2000
Traits: 0
> get(paste("males", family, sep=""))@misc$Famille_Origine
NULL
> rep(family,nInd(get(paste("males", family, sep=""))))
[1] 9 9 9

R est donc capable d'associer get(paste("males", family, sep="")) à l'objet males9, il me dit que l'objet males9@misc$Famille_Origine n'est pas renseigné, et il comprend l'instruction rep(family,nInd(get(paste("males", family, sep="")))).
Mais il refuse d'affecter cette dernière instruction au slot misc$Famille_Origine

j'ai aussi tenté

Code : Tout sélectionner

> for (family in 1:9) {
+   assign(paste("males", family, sep=""),basePop[(1:3)+9*(family-1)])
+   assign(paste("females", family, sep=""),basePop[(4:9)+9*(family-1)])
+   
+   assign(get(paste("males", family, sep=""))@misc$Famille_Origine, rep(family,nInd(get(paste("males", family, sep="")))))
+ }
Erreur dans assign(get(paste("males", family, sep = ""))@misc$Famille_Origine,  :
  premier argument incorrect

sans connaître plus de succès. Je suis sûr que ce n'est pas très loin mais je ne trouve pas.
Qui peut m'aider ? merci !
Ingénieur de recherche INRAE Toulouse

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

Re: la cible de l'assignation est un objet n'appartenant pas au langage

Messagepar Logez Maxime » 26 Nov 2024, 13:13

Bonjour,

Quelque chose comme ça ?

Code : Tout sélectionner

for (family in 1:9) {
  assign(paste("males", family, sep=""),basePop[(1:3)+9*(family-1)])
  eval(parse(text = sprintf("males%1$d@misc$Famille_Origine <- %1$d", family)))
  }


La fonction get n'est pas faite pour modifier un objet, elle te permet de charger les valeurs contenues dans un objet via son nom. Quand tu fais get, tu crées un objet temporaire en quelque sorte, mais tu ne peux pas modifier l'objet lui même. Quand tu as besoin de modifier plusieurs objets dans une boucle, tu peux écrire les lignes de commande a effectuer et ensuite les évaluer. Tu as plusieurs fonctions pour faire ça, comme parse, substitute, etc. et ensuite tu évalues tout ça avec eval.

Cordialement,
Maxime

herve chapuis
Messages : 115
Enregistré le : 05 Déc 2008, 15:26

Re: la cible de l'assignation est un objet n'appartenant pas au langage

Messagepar herve chapuis » 27 Mar 2025, 10:07

Merci !
Je n'avais pas vu ta réponse.
Ingénieur de recherche INRAE Toulouse


Retourner vers « Questions en cours »

Qui est en ligne

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