2017-10-02 12 views
1

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) 
+0

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) ') –

Répondre

4

Je suis débutant essaie simplement de comprendre Julia, donc je ne suis pas sûr si elle c'est une bonne idée ou pas!

Voir https://docs.julialang.org/en/stable/manual/metaprogramming/#Code-Generation-1.

j'ai pu adapter cet exemple à ceci:

julia> for i in 4:6 
    @eval ($(Symbol("func$i")))(a) = a^$i 
end 

julia> func4(2), func5(2), func6(2) 
(16, 32, 64) 

Peut-être que cela pourrait vous aider à jouer et apprendre :)