Yet another "how to pass multiple parameters to a function" post

Boris
Tue, 18 Mar 2025 13:46:45 +0000
New to Julia

Apologies for the n-th post on this topic (#1, #2, #3, etc. etc).I simply don’t get it and feel overwhelmed by all choices of how to pass parameters to a function (positional arguments, optional keyword arguments, named tuples with varargs, Parameters.jl).

I am developing a package, which you call a function to estimate a model. This function takes in some parameters which have default values. Even after reading most threads on the topic, I don’t understand, where do I put the structure with parameters to pass along in functions? This is if I am not using keyword arguments.

Here is my current code for a file model.jl that uses my package: Load packages, load data, use the function.

using Revise
using BEAVAR
using CSV
using Parameters


Y_20 = readdlm("data/FRED_Chan2019.txt", ',');

@with_kw struct hypChan2020
    c1::Float64 = 0.04; # hyperparameter on own lags
    c2::Float64 = 0.01; # hyperparameter on other lags
    c3::Float64 = 100;  # hyperparameter on the constant
end

store_beta = Chan2020_LBA(Y_4,hypChan2020)

where my function looks like this:

module BEAVAR
function Chan2020_LBA(YY,hypChan2020;p::Integer=4,nburn::Integer=1000,nsave::Integer=2000)
...
end
emd

I would actually like to have a larger struct hypChan2020 and not have it in the file, while the user should still be able to change the parameters. I am currently achieving this (for other parameters) with keyword arguments, and I could put c1,c2,c3, but with many it gets cumbersome.

What is the best way to pass a structure, which is not in the main .jl file that gets called in the function and the user doesn’t see it? More accurately, my question is where should I put the strcuture?

I cannot put `@with_kw’ in the function directly because I get an error that macros cannot be in the local scope.

Should I have a separate file for the options and include it? E.g.

Y_20 = readdlm("data/FRED_Chan2019.txt", ',');

include('fileWithKWMacro.jl')

store_beta = Chan2020_LBA(Y_4,hypChan2020)

I tried putting the macro in the module but I also couldn’t get it to work and that would be weird as I would have different structures for different models and I would like each to be associated with the function that needs it.

Ideally I want the user to just load the data and choose the function, i.e. they should be able to write their own model.jl without the need to include a specific file or call Parameters.jl (which I call in the module later anyways for unpacking).

Edits: rephrasing the question for clarity

8 posts - 3 participants