【发布时间】: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