Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to eval(parse(text= var_name), envir= df) if var_name is a number?

Using eval I make different stuff with variables. Here is an example where simply the variable a is returned without any transformations:

df <- data.frame(1:10); var_name <- "a"
names(df) <- var_name
eval(parse(text= var_name), envir= df) 
[1]  1  2  3  4  5  6  7  8  9 10

This works as expected. But if I call a column name as a number, e.g. 3, this does not return the expected vector 1:10:

df <- data.frame(1:10); var_name <- "3"
names(df) <- var_name
eval(parse(text= var_name), envir= df)
[1] 3

I understand that in first example I get the expected output because eval(...) is same as saving a as a variable in the global environment and then calling it, i.e. a <- df$a; a. On the other hand, the second example is same as typing 3 which returns [1] 3. Is there a way to make clear that even with numbers we want eval(...) to look for variable names in the envir argument?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

All I’ve come up with is eval(parse(text= "`3`"), envir= df) but I need a solution where I can provide the variable name with the vector var_name.

>Solution :

There are a couple of options here. You could wrap var_name in as.symbol

df <- data.frame(1:10); var_name <- "3"
names(df) <- var_name
eval(as.symbol(var_name), envir = df)
#> [1]  1  2  3  4  5  6  7  8  9 10

Or, possibly simpler, you could use get instead:

df <- data.frame(1:10); var_name <- "3"
names(df) <- var_name
get(var_name, envir = as.environment(df))
#> [1]  1  2  3  4  5  6  7  8  9 10

Note though that passing strings around as objects to be parsed into code is generally bad practice, whether you use get or eval – see here for a few reasons why.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading