Promesse d'erreur R déjà en cours d'évaluation lors de l'utilisation d'un sous-ensemble dans la fonction mais aucune erreur dans le script
Question
J'obtiens une erreur étrange lorsque j'exécute la fonction suivante :
TypeIDs=c(18283,18284,17119,17121,17123,17125,17127,17129,17131,17133,18367,18369,18371,18373,18375,18377,18379)
featsave<-function(featfile,TypeIDs=TypeIDs) {
mydata1<-read.table(featfile,header=TRUE)
mydata2<-subset(mydata1,TypeID %in% TypeIDs)
mydata<-as.data.frame(cast(mydata2, Feat1 + Feat2 + ID ~ TypeID,value="value"))
save(mydata,file="mydatafile.Rdata",compress=TRUE)
return(mydata)
}
avec les données suivantes :
Feat1 Feat2 ID Feat3 Feat4 TypeID value
1 1 1 6 266 18283 280.00
1 1 1 6 266 18284 20.00
1 1 1 6 266 18285 0.00
1 1 1 6 266 17116 0.00
1 1 1 6 266 17117 0.00
1 1 1 6 266 17118 0.00
1 1 1 6 266 17119 68.75
1 1 1 6 266 17120 0.00
1 1 1 6 266 17121 1.26
L'erreur que j'obtiens est :
Error in inherits(x, "factor") :
promise already under evaluation: recursive default argument reference or earlier problems?
Cette erreur se produit sur le mydata2
ligne où je prends un sous-ensemble des données.Je n'arrive pas à le déboguer car si j'exécute à la place chaque ligne de la fonction dans l'interpréteur, je n'obtiens plus l'erreur.Ce qui donne?
La solution
C'est votre utilisation récursive de TypeIDs
.La chose à retenir est que les arguments de fonction sont évalués paresseusement, ce qui permet des choses intéressantes comme function(foo, bar = foo)
.Malheureusement, dans ce cas, définir la valeur par défaut des TypeID sur lui-même provoque une récursion dans l'évaluation.Essayez de changer le nom du paramètre ou de l'objet externe.