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 !