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