# Accessing variables in Main within a Module using RCall

**URL:** <https://discourse.julialang.org/t/accessing-variables-in-main-within-a-module-using-rcall/63813>\
**Category:** New to Julia\
**Tags:** package, interoperability, module, rcall\
**Created:** [June 30, 2021, 10:00am UTC](https://discourse.julialang.org/t/accessing-variables-in-main-within-a-module-using-rcall/63813 "2021-06-30T10:00:04Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![viraltux](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/viraltux/32/15236_2.png) [@viraltux](https://discourse.julialang.org/u/viraltux)\
**Post date:** [June 30, 2021, 10:00am UTC](https://discourse.julialang.org/t/accessing-variables-in-main-within-a-module-using-rcall/63813/1 "2021-06-30T10:00:04Z")

</div>

I would like to access variables declared in Main from within a module but they’re not in scope and I wonder how this can be achieved.

```julia
using RCall

x = 1

f(var::String) = eval(Meta.parse("@rput ("*var*")"))

module M1
using RCall
import RCall: @rput 

f(var::String) = eval(Meta.parse("@rput ("*var*")"))

end

julia> f("x")
1

julia> M1.f("x")
ERROR: UndefVarError: x not defined

julia> M1.f("Main.x")
ERROR: LoadError: Incorrect usage of @rput

```

---

<div class="post-metadata">

**Author:** ![Skoffer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skoffer/32/378_2.png) [@Skoffer](https://discourse.julialang.org/u/Skoffer)\
**Post date:** [June 30, 2021, 10:08am UTC](https://discourse.julialang.org/t/accessing-variables-in-main-within-a-module-using-rcall/63813/2 "2021-06-30T10:08:43Z")

</div>

You can use fully qualified variable name

```julia
julia> M1.f("Main.x")
1

```

Alternatively you can import names into module

```julia
module M1
using Main: x
f(var::String) = eval(Meta.parse("println("*var*")"))
end

julia> M1.f("x")
1

```

---

<div class="post-metadata">

**Author:** ![viraltux](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/viraltux/32/15236_2.png) [@viraltux](https://discourse.julialang.org/u/viraltux)\
**Post date:** [June 30, 2021, 11:57am UTC](https://discourse.julialang.org/t/accessing-variables-in-main-within-a-module-using-rcall/63813/3 "2021-06-30T11:57:25Z")

</div>

Hi @Skoffer

Thank you very much for your answer, unfortunately I simplified the problem too much.  
I am using `@rput` from the `RCall` package and `@rput Main.x` returns and error. I just updated the original post with an slightly less simplified example.

---

<div class="post-metadata">

**Author:** ![genkuroki](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/genkuroki/32/18030_2.png) [@genkuroki](https://discourse.julialang.org/u/genkuroki)\
**Post date:** [July 1, 2021, 1:10pm UTC](https://discourse.julialang.org/t/accessing-variables-in-main-within-a-module-using-rcall/63813/4 "2021-07-01T13:10:49Z")

</div>

It is rather difficult to understand `eval` functions. Each module has its own `eval(x)`, which evaluates expressions in that module (= name space).

```julia
using RCall

x = 1

f(var::String) = eval(:(@rput($(Symbol(var)))))

module M2

using RCall

x = 2

f(var::String) = eval(:(@rput($(Symbol(var)))))
g(var::String) = Main.eval(:(@rput($(Symbol(var)))))
g(m::Module, var::String) = Core.eval(m, :(@rput($(Symbol(var)))))

end

```

```julia
julia> M2.f("x")
2

julia> R"x"
RObject{IntSxp}
[1] 2

```

```julia
julia> M2.g("x")
1

julia> R"x"
RObject{IntSxp}
[1] 1

```

```julia
julia> M2.g(M2, "x") # equivalent to M2.f("x")
2

julia> R"x"
RObject{IntSxp}
[1] 2

```

---

<div class="post-metadata">

**Author:** ![viraltux](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/viraltux/32/15236_2.png) [@viraltux](https://discourse.julialang.org/u/viraltux)\
**Post date:** [July 1, 2021, 5:30pm UTC](https://discourse.julialang.org/t/accessing-variables-in-main-within-a-module-using-rcall/63813/5 "2021-07-01T17:30:40Z")

</div>

Thanks @genkuroki!
