On Fri, Jul 3, 2015 at 8:37 PM, Kevin Owens <kevin.j.ow...@gmail.com> wrote: > Yes, you're right, that won't work. > > I got to thinking about this from this part of the DataFrames documentation: > http://dataframesjl.readthedocs.org/en/latest/getting_started.html#the-dataframe-type > > df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"]) > > and this code > > df = DataFrame() > df[:A] = 1:8 > df[:B] = ["M", "F", "F", "M", "F", "M", "M", "F"] > df > > If I already had arrays A and B (or an arbitrary number of them) it would be > nice to be able to do > > df = DataFrame(A, B) > > and then df would have column names :A and :B. >
And that's exactly what I guessed what you wanted (because I've done sth similar in python sometime ago :P) The right way to do this is to specify the name of the variable because a variable is always bound to a single object while a object can be bound to multiple varialbles. The way I did it in python was using eval. However, in Julia, the eval function is working in the global (module) scope (otherwise the compiler cannot reason anything about local variables) so you cannot use it to get the value of a variable. One way to do this in julia is using macros What you want is basically to write sth like: ``` <some magic>(A, B) ``` to achieve the effect of ``` DataFrame(A=A, B=B) ``` Well, this is a simple code transformation. (untested code below) ``` macro dataframe(args...) :(DataFrame($([Expr(:kw, arg, arg) for arg in args]...))) end ``` If you would like to figure out how to write a macro, the general procedure is to see the input and output AST with `Meta.show_sexpr` (which is better than `show` for this because some symbols are parsed differently in different context) and then write a program to do the transformation. > > > On Friday, July 3, 2015 at 7:24:55 PM UTC-5, Yichao Yu wrote: >> >> On Fri, Jul 3, 2015 at 8:21 PM, Kevin Owens <kevin....@gmail.com> wrote: >> > Gah, nevermind: >> > >> > function as_symbol(x) >> > :(print(x)).args[2] >> > end >> >> This is almost certainly not what you want unless you just want a >> function that returns `:x`, in which case, you would be better off to >> just return that. >> >> Can you elaborate on what exactly you would like to do? Depending on >> what you really want, there are different ways to implement. >> >> > >> > >> > (using print() so that it works regardless of the type) >> > >> > >> > On Friday, July 3, 2015 at 7:16:38 PM UTC-5, Kevin Owens wrote: >> >> >> >> Say you have an array >> >> >> >> x = rand(5) >> >> >> >> or just any variable >> >> >> >> y = "abc" >> >> >> >> How would I write a function that I would call like foo(x) and would >> >> return the symbol :x?