# String as a variable name

**URL:** https://discourse.julialang.org/t/string-as-a-variable-name/2195
**Category:** General Usage
**Created:** [February 21, 2017, 1:43am UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195 "2017-02-21T01:43:29Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![Aaron1488](https://avatars.discourse-cdn.com/v4/letter/a/e8c25b/32.png) [@Aaron1488](https://discourse.julialang.org/u/Aaron1488)
#### Post date: [February 21, 2017, 1:43am UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/1 "2017-02-21T01:43:29Z")

</div>

How can I convert a string to variable name an assign some value to this variable? In R I use assign() function for this, but I was not able to find its equivalent in Julia.

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [February 21, 2017, 2:34am UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/2 "2017-02-21T02:34:48Z")

</div>

No it’s not possible and you shouldn’t do it. Use a `Dict` instead.

---

<div class="post-metadata">

### Author: ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)
#### Post date: [February 21, 2017, 3:51am UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/3 "2017-02-21T03:51:34Z")

</div>

You might want to look into metaprogramming.

[http://docs.julialang.org/en/release-0.5/manual/metaprogramming/](http://docs.julialang.org/en/release-0.5/manual/metaprogramming/)

or use a `Dict` as @yuyichao suggests.

---

<div class="post-metadata">

### Author: ![jamm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jamm/32/7118_2.png) [@jamm](https://discourse.julialang.org/u/jamm)
#### Post date: [February 28, 2017, 12:22am UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/4 "2017-02-28T00:22:35Z")

</div>

OR you can use simple function (metaprogramming):

```julia
## string to varname function, see
## https://groups.google.com/forum/#!topic/julia-dev/z-dyQ_jUgk8
function string_as_varname(s::AbstractString,v::Any)
         s=symbol(s)
         @eval (($s) = ($v))
end

```

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [February 28, 2017, 12:46am UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/5 "2017-02-28T00:46:22Z")

</div>

If you only care about global variables then something similar to this will certainly work.

---

<div class="post-metadata">

### Author: ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)
#### Post date: [February 28, 2017, 1:05am UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/6 "2017-02-28T01:05:36Z")

</div>

> [@jamm](#):
>
> @eval (($s) = ($v))

As @yuyichao pointed towards, `eval` works in the global scope, so this may not work the way you think it would inside of a function.

---

<div class="post-metadata">

### Author: ![NickNack](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nicknack/32/1792_2.png) [@NickNack](https://discourse.julialang.org/u/NickNack)
#### Post date: [February 28, 2017, 12:34pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/7 "2017-02-28T12:34:12Z")

</div>

Doing it as a macro seems to work correctly inside a function (i.e. variables are created only in the local scope):

```julia
macro string_as_varname_macro(s::AbstractString, v::Any)
	s = Symbol(s)
	esc(:($s = $v))
end

function string_as_varname_function(s::AbstractString, v::Any)
	s = Symbol(s)
	@eval (($s) = ($v))
end

function test()
	string_as_varname_function("a",2)
	@string_as_varname_macro("b",3)
	println("(a,b) = ($a,$b)")
end

test()
isdefined(:a) && println("a = $a")
isdefined(:b) && println("b = $b")
nothing

```

Output:

```julia
(a,b) = (2,3)
a = 2

```

I’ve only been working with Julia for a few weeks, so please explain if this has some unintended side effect.

---

<div class="post-metadata">

### Author: ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)
#### Post date: [February 28, 2017, 12:43pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/8 "2017-02-28T12:43:45Z")

</div>

> [@Aaron1488](#):
>
> How can I convert a string to variable name an assign some value to this variable? In R I use assign() function for this, but I was not able to find its equivalent in Julia.

As @yuyichao suggested, you are almost certainly going about the wrong way to do something. If you explain a little more about what you are trying to do, we could probably suggest something better.

---

<div class="post-metadata">

### Author: ![NickNack](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nicknack/32/1792_2.png) [@NickNack](https://discourse.julialang.org/u/NickNack)
#### Post date: [February 28, 2017, 1:26pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/9 "2017-02-28T13:26:09Z")

</div>

I don’t know why Aaron1488 wants to do this, but I have a use case.

When building large optimization models in JuMP, you will often want to assign values to model parameters using external files in spreadsheets. When your model contains complex equations, it really helps readibility and maintainability if you can write `parameter1D` and `parameter3D[a,b,c]` in your equations instead of looking up parameters in a Dict like `allparameters["parameter1D"]` and `allparameters["parameter3D",a,b,c]`.

I guess you could first read the external data into the Dict and then manually add local variable aliases for each parameter, but that gets verbose and messy when you have dozens of parameters.

I think using the macro to define local variables for parameters is the best solution, but I’m open to suggestions if someone has a better idea.

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [February 28, 2017, 1:45pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/10 "2017-02-28T13:45:31Z")

</div>

Perhaps the `@unpack` macro in [https://github.com/mauro3/Parameters.jl](https://github.com/mauro3/Parameters.jl) can be useful.

---

<div class="post-metadata">

### Author: ![mkborregaard](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkborregaard/32/556_2.png) [@mkborregaard](https://discourse.julialang.org/u/mkborregaard)
#### Post date: [February 28, 2017, 2:07pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/11 "2017-02-28T14:07:18Z")

</div>

You can also use the @with macro in DataFramesMeta

```julia
using DataFramesMeta

a = Dict(:parameter1D => [1,2,3])
@with a begin
   :parameter1D.^2
end

```

---

<div class="post-metadata">

### Author: ![davidzentlermunro](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/davidzentlermunro/32/5967_2.png) [@davidzentlermunro](https://discourse.julialang.org/u/davidzentlermunro)
#### Post date: [December 18, 2018, 4:34pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/12 "2018-12-18T16:34:52Z")

</div>

I’m doing a similar exercise and wondered what solution you opted for i.e. did you just accept cumbersome dictionary format or go for something else? I’m probably going to do what you mention here: “I guess you could first read the external data into the Dict and then manually add local variable aliases for each parameter” unless anyone has any good suggestions.

---

<div class="post-metadata">

### Author: ![rdeits](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rdeits/32/286_2.png) [@rdeits](https://discourse.julialang.org/u/rdeits)
#### Post date: [December 18, 2018, 6:13pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/13 "2018-12-18T18:13:26Z")

</div>

In Julia 1.0, you can now use `getproperty` overloading to make accessing the dictionary more concise:

```julia
julia> struct Params
         data::Dict{String, Any}
       end

julia> Base.getproperty(p::Params, name::Symbol) = getfield(p, :data)[String(name)]

julia> p = Params(Dict("foo" => 1, "bar" => [1,2,3]))
Params(Dict{String,Any}("bar"=>[1, 2, 3],"foo"=>1))

julia> p.foo
1

julia> p.bar
3-element Array{Int64,1}:
 1
 2
 3

```

---

<div class="post-metadata">

### Author: ![Juan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juan/32/7657_2.png) [@Juan](https://discourse.julialang.org/u/Juan)
#### Post date: [January 25, 2020, 12:52pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/14 "2020-01-25T12:52:35Z")

</div>

But quite often you need to generate variable names programatically such as name1, name2, name3… How can you get it with Dicts?

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [January 25, 2020, 1:14pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/15 "2020-01-25T13:14:32Z")

</div>

In local scope? For global scope you could use `eval`.

---

<div class="post-metadata">

### Author: ![mkborregaard](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkborregaard/32/556_2.png) [@mkborregaard](https://discourse.julialang.org/u/mkborregaard)
#### Post date: [January 25, 2020, 1:50pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/16 "2020-01-25T13:50:06Z")

</div>

> [@Juan](#):
>
> But quite often you need to generate variable names programatically

Why? In what contexts do you need this quite often?

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [January 26, 2020, 1:52pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/17 "2020-01-26T13:52:50Z")

</div>

The only context I can think of where you do need to “generate variable names programatically” is when you are generating code programatically (which is basically repeating myself since variable names is part of code). And yes, in those cases, as long as you can obtain the compile time information you want you can do whatever you want to genenrate the code.

---

<div class="post-metadata">

### Author: ![ChantalJuntao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chantaljuntao/32/8251_2.png) [@ChantalJuntao](https://discourse.julialang.org/u/ChantalJuntao)
#### Post date: [February 6, 2020, 9:25pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/18 "2020-02-06T21:25:17Z")

</div>

When you need a fast albeit inelegant way to sort through individually meaningless parts of large data-set, as is often the case in scientific programming.

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [February 6, 2020, 10:15pm UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/19 "2020-02-06T22:15:49Z")

</div>

There’s nothing in that problem that requires using string as variable names. You need string to access objects, variable names never comes in.

---

<div class="post-metadata">

### Author: ![dpsanders](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dpsanders/32/3573_2.png) [@dpsanders](https://discourse.julialang.org/u/dpsanders)
#### Post date: [February 7, 2020, 4:58am UTC](https://discourse.julialang.org/t/string-as-a-variable-name/2195/20 "2020-02-07T04:58:20Z")

</div>

Use a `Vector`?  
`name[1]`, `name[2]` etc.

EDIT: Or a `Dict`

[Next page](https://discourse.julialang.org/t/string-as-a-variable-name/2195.md?page=2)
