How to convert a string in a function into an object?
The trick is to use parse
. For instance:
> x <- "A"
> eval(parse(text=paste("df$", x, sep = "")))
[1] 1 2 3 4 5 6 7 8 9 10
See also this Q/A: Evaluate expression given as a string
I just got an upvote which brought me back after 5 years to this question. I still think that the correct answer is [[
despite the OP's request not to use it, but here's a way to dress up [[
as a more functional "function".
df <- structure(list(x = 1:3, y = 1:3), .Names = c("x", "y"), row.names = c(NA,
-3L), class = "data.frame")
test.function <- `[[` # So simple, `test.function` now has all the features desired.
df
x y
1 1
2 2
3 3
test.function(df, "x")
#[1] 1 2 3
Or if it were desireable to hard code pulling an object named 'df' from the calling environment, a proposition that seems of dubious safety:
test.df_txt <- function(var, dfn ='df' ){ get(dfn)[[var]] }
test.df_txt("x")
#[1] 1 2 3
Original response (still not recommended):
You can sidestep around the limitations of "$" if you are willing to use eval(parse(text=...)) :
test.function <- function(x) {
z <- eval(parse( text=paste("df$", x, sep = "")), env=.GlobalEnv)
return(z)
}
test.function("A")
# [1] 1 2 3 4 5 6 7 8 9 10
BUT ... it is much better to use "[[". (My initial efforts at eval(parse()
-ing were stuck at not knowing enough to use the "text" argument to parse
.)
You can create a variable name from a string using the assign operator, as in: assign("a_string", NULL)
In addition to eval(parse(text=YOUR_STRING))
, you can use as.symbol
as a potential alternative.