Search code examples
rexpressiondata.tablequote

how to create a quoted expression from strings


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...  (notice the lack of '"' marks)
quote(list(string1, string2))

I am encountering some difficulty dropping the quotation marks

input <- c("string1", "string2")
output <- paste0("quote(list(", paste(input, collapse=","), "))")

# not quite what I am looking for.     
as.expression(output)
expression("quote(list(string1,string2))")



This is for use in data.table column selection, in case relevant.
What I am looking for should be able to fit into data.table as follows:

library(data.table)
mydt <- data.table(id=1:3, string1=LETTERS[1:3], string2=letters[1:3])

result <- ????? # some.function.of(input)
> mydt[ , eval( result )]
   string1 string2
1:       A       a
2:       B       b
3:       C       c

Solution

  • 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