J'ai un DataFrame structuré comme parName|region|year
, et la fonction d'accès est getData(parName,reg,year)
(j'utilise la fonction d'accès parce que j'implémente ma propre logique de requête).Définition de nom de fonction dynamique dans Julia .. possible?
Serait-il possible, sur la base unique(df[:parName])
, de créer dynamiquement un ensemble de fonctions comme par1(region,year)
« pointant vers » getData("par1",region,year)
?
Si oui, avec quelle approche?
C'est un peu à l'opposé de this question .. il il est expliqué comment appeler dynamiquement une fonction, alors que je divague si possible de déclarer dynamiquement/définir un ..
EDIT:
J'utilise cette approche pour obtenir la syntaxe la plus propre et la plus compacte possible dans l'écriture d'équations multidimensionnelles. Je réussi (grâce à la réponse @Liso) à mettre en œuvre comme:
for par in unique(dropna(df[:parName]))
@eval ($(Symbol("$(par)_"))) = (r,d1,d2="",y=-1,op=sum) -> gd($par,r,d1,d2,y,op)
@eval ($(Symbol("$(par)!"))) = (v,r,d1,d2="",y=-1) -> sd(v,$par,r,d1,d2,y)
end
dire, je me sers de la convention qui par!()
est un type setData et par_()
est une équation de type getData. When I'll be able to complete the macro that transforms f(dim1,dim2) = value
into f(value,dim1,dim2)
je serai capable d'écrire mon modèle en utilisant un LATEX semblable (et AMPL-like) syntaxe qui est très claire:
@meq price!(tp in secProducts, r in fr2) = sum(price_(r,pp,"",y2)*a_(r,pp,tp,y2) for pp in priProducts) + margin_(r,tp,"",y2)
Pourquoi voudriez-vous même le faire bien? En général, il est fortement déconseillé d'utiliser des identifiants «ordonnés» uniques pour des choses qui devraient normalement appartenir à un tableau. Tout au plus, si vous voulez vraiment des fonctions qui ne prennent que deux arguments, vous voudrez peut-être regarder les fonctions de génération de fermeture et "currying" (c.-à-d. Créer quelque chose comme: 'get (" par1 ") (région, année) ') –