how to create a quoted expression from strings

后端 未结 3 927
遥遥无期
遥遥无期 2021-01-31 12:27

Given a vector of strings, I would like to create an expression without the quotation marks.

# eg, I would like to go from 
c(\"string1\", \"string2\")

# to...         


        
相关标签:
3条回答
  • 2021-01-31 12:35

    I tend to use as.quoted from the plyr package

     outputString <- sprintf('list(%s)', paste(input, collapse = ', ')) 
    
    
     library(plyr)
      output <- as.quoted(outputString)[[1]]
    
      mydt[, eval(output)]
       string1 string2
    1:       A       a
    2:       B       b
    3:       C       c
    

    However if it is simply column selection, you can pass the string and use .. (which, like in the Unix terminal, means to "look up one level")

    mydt[ , ..input]
       string1 string2
    1:       A       a
    2:       B       b
    3:       C       c
    
    0 讨论(0)
  • 2021-01-31 12:49

    Here is what I'd do:

    ## Create an example of a data.table "dt" whose columns you want to index 
    ## using a character vector "xx"
    library(data.table)
    dt <- data.table(mtcars)
    xx <- c("wt", "mpg")
    
    ## Construct a call object identical to that produced by quote(list("wt", "mpg"))
    jj <- as.call(lapply(c("list", xx), as.symbol))
    
    ## Try it out
    dt[1:5,eval(jj)]
    #       wt  mpg
    # 1: 2.620 21.0
    # 2: 2.875 21.0
    # 3: 2.320 22.8
    # 4: 3.215 21.4
    # 5: 3.440 18.7
    

    When "computing on the language" like this, it's often helpful to have a look at the structure of the object you're trying to construct. Based on the following (and once you know about as.call() and as.symbol()), creating the desired language object becomes a piece of cake:

    x <- quote(list(wt, mpg))
    
    str(x)
    #  language list(wt, mpg)
    
    class(x)
    # [1] "call"
    
    str(as.list(x))
    # List of 3
    #  $ : symbol list
    #  $ : symbol wt
    #  $ : symbol mpg
    
    0 讨论(0)
  • 2021-01-31 12:49

    I found these answers helpful but incomplete for using variables and multiple lines within the expression. To create a quoted expression from strings, with variables and multiple lines make use of quote(), atop() and subsititute():

      # Prepare variables
      samp_skewness = round(skewness(dv),2)
      samp_kurtosis = round(kurtosis(dv),2)
      samp_var = round(var(dv))
      samp_summ <- summary(dv)
      num_samples = length(dv)
    
      # Prepare quotes containing math annotations
      q1 = quote(paste(mu,"="))
      q2 = quote(paste(sigma,"="))
      q3 = quote(paste(gamma[1],"="))
      q4 = quote(paste(gamma[2],"="))
    
    # Use subsitition to construct the expression, passing in the variables and quoted expressions
      title = substitute(atop(paste("Top Title, # samples: ", ns), 
                paste(e1,v1,", ",e2,v2,", ",e3,v3,", ",e4,v4)),
                list(ns=num_samples,v1=round(samp_summ['Mean']),v2=samp_var,
                v3=samp_skewness,v4=samp_kurtosis,e1=q1,e2=q2,e3=q3,e4=q4))
    

    In ggplot: ...

    labs(title = title) +
    

    ...

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