I would like to convert a string that I pass in a function into an object (or column name).
I know that this works:
df <- data.frame(A = 1:10, B = 11:20)  test.function <- function(x)             {   z <- df[[x]]   return(z) } test.function("A")   I don't want to use the [[.]] operator, because sometimes it is unpractical or even not applicable. I am interessted in a general method to convert a string into an "object". Therefore I tried the following:
df <- data.frame(A = 1:10, B = 11:20)  test.function <- function(x) {   z <- get(paste("df$", x, sep = ""))   return(z) } test.function("A")   or
df <- data.frame(A = 1:10, B = 11:20)  test.function <- function(x) {   z <- as.name(paste("df$", x, sep = ""))   return(z) } test.function("A")   or
df <- data.frame(A = 1:10, B = 11:20)  test.function <- function(x) {   z <- df$as.name(x)   return(z) } test.function("A")   I also tried to play around with the parse, do.call and eval functions. Unfortunatelly I failed
Use the json.loads() function. The json. loads() function accepts as input a valid string and converts it to a Python dictionary. This process is called deserialization – the act of converting a string to an object.
We can also convert the string to an object using the Class. forName() method. Parameter: This method accepts the parameter className which is the Class for which its instance is required.
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.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With