Search code examples
juliavariadic-functionskeyerror

Varargs is giving key error in Julia


Consider the following table:

julia> using RDatasets, DataFrames
julia> anscombe = dataset("datasets","anscombe")
11x8 DataFrame
| Row | X1 | X2 | X3 | X4 | Y1    | Y2   | Y3    | Y4   |
|-----|----|----|----|----|-------|------|-------|------|
| 1   | 10 | 10 | 10 | 8  | 8.04  | 9.14 | 7.46  | 6.58 |
| 2   | 8  | 8  | 8  | 8  | 6.95  | 8.14 | 6.77  | 5.76 |
| 3   | 13 | 13 | 13 | 8  | 7.58  | 8.74 | 12.74 | 7.71 |
| 4   | 9  | 9  | 9  | 8  | 8.81  | 8.77 | 7.11  | 8.84 |
| 5   | 11 | 11 | 11 | 8  | 8.33  | 9.26 | 7.81  | 8.47 |
| 6   | 14 | 14 | 14 | 8  | 9.96  | 8.1  | 8.84  | 7.04 |
| 7   | 6  | 6  | 6  | 8  | 7.24  | 6.13 | 6.08  | 5.25 |
| 8   | 4  | 4  | 4  | 19 | 4.26  | 3.1  | 5.39  | 12.5 |
| 9   | 12 | 12 | 12 | 8  | 10.84 | 9.13 | 8.15  | 5.56 |
| 10  | 7  | 7  | 7  | 8  | 4.82  | 7.26 | 6.42  | 7.91 |
| 11  | 5  | 5  | 5  | 8  | 5.68  | 4.74 | 5.73  | 6.89 |

I have defined a function as follows:

julia> f1(df, matchval, matchfield, qfields...) = isempty(qfields)
WARNING: Method definition f1(Any, Any, Any, Any...) in module Main at REPL[314]:1 overwritten at REPL[317]:1.
f1 (generic function with 3 methods)

Now below is the problem

julia> f1(anscombe,  11, "X1")
ERROR: KeyError: key :field not found
 in getindex at ./dict.jl:697 [inlined]
 in getindex(::DataFrames.Index, ::Symbol) at /home/arghya/.julia/v0.5/DataFrames/src/other/index.jl:114
 in getindex at /home/arghya/.julia/v0.5/DataFrames/src/dataframe/dataframe.jl:228 [inlined]
 in f1(::DataFrames.DataFrame, ::Int64, ::String) at ./REPL[249]:2

Where am I doing wrong? FYI I'm using Julia Version 0.5.2. How to overcome this problem? Thanks in advance!


Solution

  • There is nothing wrong with your code - try running just what you've posted in a fresh session. Possibly you've defined another f1 method before. If you come from R, you may assume that this is overwritten by f1(df, matchval, matchfield, qfields...) = isempty(qfields), while in fact you're just defining a new method for the f1 function. The error is probably thrown by a 3-argument version you've defined earlier. Look at https://docs.julialang.org/en/stable/manual/methods/