treat string as object name in a loop in R

15,583

Solution 1

You could create the call() to <- and then evaluate it. Here's an example,

value <- 1:5

for (i in 1:2) {
    x <- paste("varname",i, sep="")
    eval(call("<-", as.name(x), value))
}

which creates the two objects varname1 and varname2

varname1
# [1] 1 2 3 4 5
varname2
# [1] 1 2 3 4 5

But you should really try to avoid assigning to the global environment from with in a method/function. We could use a list along with substitute() and then we have the new variables together in the same place.

f <- function(aa, bb) {
    eval(substitute(a <- b, list(a = as.name(aa), b = bb)))
}

Map(f, paste0("varname", 1:2), list(1:3, 3:6))
# $varname1
# [1] 1 2 3
#
# $varname2
# [1] 3 4 5 6

Solution 2

@MahmutAliÖZKURAN has answered your question about how to do this using a loop. A more "R-ish" way to accomplish this might be:

mapply(assign, <vector of variable names>, <vector of values>,
       MoreArgs = list(envir = .GlobalEnv))

Or, as in the case you specified above:

mapply(assign, paste0("varname", 1:2), <vector of values>,
       MoreArgs = list(envir = .GlobalEnv))

Solution 3

assign("variableName", 5)

would do that.

For example if you have variable names in array of strings you can set them in loop as:

assign(varname[1], 2 + 2)

More and more information

https://stat.ethz.ch/R-manual/R-patched/library/base/html/assign.html

Share:
15,583

Related videos on Youtube

Tabasco
Author by

Tabasco

Updated on September 16, 2022

Comments

  • Tabasco
    Tabasco over 1 year

    I want to create a string in a loop and use this string as object in this loop. Here is a simplified example:

    for (i in 1:2) {
      x <- paste("varname",i, sep="")
      x <- value
    }
    

    the loop should create varname1, varname2. Then I want to use varname1, varname2 as objects to assign values. I tried paste(), print() etc. Thanks for help!

  • Gregor Thomas
    Gregor Thomas about 9 years
    A more R-ish way to do things is to use lists and not assign.
  • Gregor Thomas
    Gregor Thomas about 9 years
    Yes, all the answers do what the OP asked for. I'm just picking on yours for the "more R-ish" quip ;)
  • Tabasco
    Tabasco about 9 years
    Thanks a lot to you all for your helpful answers! The solution with call() works very well. I'll try the more R-ish strategies as soon as I understand what's really going on (I am spoiled by Stata and thinking in loops).
  • Mox
    Mox about 6 years
    So If I've got this right, it assigns to variable name 1, the value of 4 (evalulating 2+2 without needing to be told to do so).
  • Miha Trošt
    Miha Trošt over 5 years
    Ok, I upvoted your solution. I played with it...and now I want to upvote your solution for 1k times more. :)