Quantcast
Channel: First steps - JuliaLang
Viewing all articles
Browse latest Browse all 2795

Call a macro from within a funciton

$
0
0

I am working with DataFrames.jl and DataFramesMeta.jl (which I love).
So consider the following MWE, not directly related to my actual work:

using DataFrames, DataFramesMeta
grps = groupby(dff, :col1)
dff = DataFrame([[1,2,3],[4,5,6]], [:col1,:col2])
dd = @based_on(grps, count=length(:col2))

which produces the correct result. So of course, I wish to put this procedure into a function as follows:

function find(df::DataFrame, group_col::Symbol, selector::Symbol)
    grps = groupby(df, group_col)
    w_count_df = @based_on(grps, count=length(group_col))
end

dff = DataFrame([[1,2,3],[4,5,6]], [:col1,:col2])
dd = find(dff, :col1, :col2)

which produces an error because the macro expansion occurs before the call to the function:

julia> dd = find(dff, :col1, :col2)
ERROR: MethodError: no method matching length(::Symbol)
Closest candidates are:
  length(::Core.SimpleVector) at essentials.jl:596
  length(::Base.MethodList) at reflection.jl:852
  length(::Core.MethodTable) at reflection.jl:938
  ...
Stacktrace:
 [1] (::var"#288#289"{Symbol})(::SubDataFrame{DataFrame,DataFrames.Index,Array{Int64,1}}) at /Users/erlebach/.julia/packages/DataFramesMeta/c67UK/src/DataFramesMeta.jl:80
 [2] _combine(::var"#288#289"{Symbol}, ::GroupedDataFrame{DataFrame}, ::Nothing, ::Bool, ::Bool) at /Users/erlebach/.julia/packages/DataFrames/kwVTY/src/groupeddataframe/splitapplycombine.jl:1215
 [3] combine_helper(::Function, ::GroupedDataFrame{DataFrame}, ::Nothing; keepkeys::Bool, ungroup::Bool, copycols::Bool, keeprows::Bool) at /Users/erlebach/.julia/packages/DataFrames/kwVTY/src/groupeddataframe/splitapplycombine.jl:583
 [4] #combine#375 at /Users/erlebach/.julia/packages/DataFrames/kwVTY/src/groupeddataframe/splitapplycombine.jl:434 [inlined]
 [5] combine at /Users/erlebach/.julia/packages/DataFrames/kwVTY/src/groupeddataframe/splitapplycombine.jl:434 [inlined]
 [6] find(::DataFrame, ::Symbol, ::Symbol) at /Users/erlebach/covid_modeling_julia/julia_code/sir-julia/SIRsims/gordon_julia_code/household_workplaces_leon/drawNetwork.jl:22
 [7] top-level scope at none:0

So how would I make this work, WITHOUT modifying the @based_on macro? I can’t go make changes to existing macros every time I want to call a macro. I have read as much as I could understand. Thank you.

2 posts - 2 participants

Read full topic


Viewing all articles
Browse latest Browse all 2795

Trending Articles