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

前端 未结 5 842
你的背包
你的背包 2020-12-14 17:55

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 =         


        
相关标签:
5条回答
  • 2020-12-14 18:37

    In addition to eval(parse(text=YOUR_STRING)), you can use as.symbol as a potential alternative.

    0 讨论(0)
  • 2020-12-14 18:37

    The function call nicely does what you want like this:

    x <- data.frame(a = c(TRUE, FALSE, NA), b = 1:9, c = dnorm(-4:4), d = exp(-4:4 * 1i), `syntaxically invalid name` = LETTERS[1:9], check.names = FALSE)
    
    
    solution <- function (string)
    eval(call(name = "$", quote(x), as.symbol(string)))
    
    
    print(solution("a"))
    print(solution("syntaxically invalid name"))
    

    If you wanted to be able to specify the name of the object you're retrieving the column from, try:

    x <- data.frame(a = c(TRUE, FALSE, NA), b = 1:9, c = dnorm(-4:4), d = exp(-4:4 * 1i), `syntaxically invalid name` = LETTERS[1:9], check.names = FALSE)
    y <- x
    y$b <- y$b * 2L
    
    
    solution <- function (object.name, string)
    eval(call(name = "$", as.symbol(object.name), as.symbol(string)))
    
    
    print(solution("x", "b"))
    print(solution("y", "b"))
    
    0 讨论(0)
  • 2020-12-14 18:47

    You can create a variable name from a string using the assign operator, as in: assign("a_string", NULL)

    0 讨论(0)
  • 2020-12-14 18:56

    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

    0 讨论(0)
  • 2020-12-14 18:56

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

    0 讨论(0)
提交回复
热议问题