【问题标题】:Dynamic function name definition in Julia.. possible?Julia中的动态函数名称定义..可能吗?
【发布时间】:2017-10-02 18:53:11
【问题描述】:

我有一个结构为parName|region|year 的DataFrame,访问函数为getData(parName,reg,year)(我使用访问函数,因为我实现了自己的查询逻辑)。

是否有可能基于unique(df[:parName]),动态创建一组函数,如par1(region,year)“指向”getData("par1",region,year)

如果是这样,使用哪种方法?

这与this 问题有点相反。它解释了如何动态调用函数,而我徘徊是否可以动态声明/定义一个函数。..

编辑:

我使用这种方法是为了在编写多维方程时获得最简洁和最紧凑的语法。 我设法(感谢@Liso 的回答)将其实现为:

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

即,我使用的约定是 par!() 是 setData 类型,par_() 是 getData 类型等式。 When I'll be able to complete the macro that transforms f(dim1,dim2) = value into f(value,dim1,dim2) 我将能够使用非常清晰的类似 LaTeX(和类似 AMPL)的语法编写我的模型:

@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)

【问题讨论】:

  • 你为什么还要这样做呢?一般来说,强烈建议不要对本来应该属于数组的事物使用唯一的“有序”标识符。最多,如果你真的想要只接受两个参数的函数,也许你想看看闭包生成函数和“currying”(即创建你会调用的东西:get("par1")(region, year)

标签: dataframe julia metaprogramming


【解决方案1】:

我只是想了解 Julia 的初学者,所以我不确定这是否是个好主意!

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

我能够使这个例子适应这个:

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

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

也许它可以帮助你玩和学习:)

【讨论】:

  • 如何在其中添加类型签名?谢谢。
  • 就像您在常规函数中所做的那样。例如。 @eval ($(Symbol("func$i")))(a::Int) = a^$i。如果需要,您还可以迭代多种类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多