treat string as object name in a loop in R
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
Related videos on Youtube
Tabasco
Updated on September 16, 2022Comments
-
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!
-
Steven Beaupré about 9 yearsDon't use
assign()
to create many vars. Instead learn how to work with lists and functionals twitter.com/hadleywickham/status/535931179556691968
-
-
Gregor Thomas about 9 yearsA more R-ish way to do things is to use lists and not
assign
. -
Gregor Thomas about 9 yearsYes, all the answers do what the OP asked for. I'm just picking on yours for the "more R-ish" quip ;)
-
Tabasco about 9 yearsThanks 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 about 6 yearsSo 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 over 5 yearsOk, I upvoted your solution. I played with it...and now I want to upvote your solution for 1k times more. :)