Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert a string in a function into an object?

Tags:

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

like image 393
Hagen Brenner Avatar asked Nov 19 '11 18:11

Hagen Brenner


People also ask

How do I convert a string to an object in Python?

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.

Can we convert string to object in java?

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.


2 Answers

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

like image 121
John Colby Avatar answered Nov 20 '22 17:11

John Colby


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.)

like image 23
IRTFM Avatar answered Nov 20 '22 19:11

IRTFM