Construct list from a dataframe and a formula A dataframe and a right-sided formula are given:
dat &lt;- data.frame(
  A = c(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;),
  B = c(&quot;x&quot;, &quot;y&quot;, &quot;z&quot;),
  NotUsed = c(1, 2, 3)
)

frml &lt;- ~ A + B + A:B

From them, I want to get this list:
# [[1]]
# [1] a b c
# Levels: a b c
# 
# [[2]]
# [1] x y z
# Levels: x y z
# 
# [[3]]
# [1] a:x b:y c:z
# Levels: a:x b:y c:z

Here is how I get this list:
library(lazyeval) # to use 'as.lazy' and 'lazy_eval'
tf &lt;- terms.formula(frml)
factors &lt;- rownames(attr(tf, &quot;factors&quot;))
tvars &lt;- attr(tf, &quot;variables&quot;)
tlabs &lt;- attr(tf, &quot;term.labels&quot;)
used &lt;- lapply(eval(tvars, envir = dat), as.factor)
names(used) &lt;- factors
lapply(tlabs, function(tlab){
  droplevels(lazy_eval(as.lazy(tlab), data = used))
})

Do you have a better way to propose?
Code Quality
Blank Lines
Generally, your code quality needs some improvement. For example, insert blank lines. So instead of
factors &lt;- rownames(attr(tf, &quot;factors&quot;))
tvars &lt;- attr(tf, &quot;variables&quot;)
tlabs &lt;- attr(tf, &quot;term.labels&quot;)

I would suggest
factors &lt;- rownames(attr(tf, &quot;factors&quot;))

tvars &lt;- attr(tf, &quot;variables&quot;)

tlabs &lt;- attr(tf, &quot;term.labels&quot;)

Order Within A Script or Source Code
Generally, one puts package import statements at the top of a file. Which you are not doing, and you also give no reason why you are doing it. So I would put library(lazyeval) at the top.
Further, you set variables before you use them. For example, factors &lt;- rownames(attr(tf, &quot;factors&quot;)).
These observations lead to the following script.
# to use 'as.lazy' and 'lazy_eval'
library(lazyeval)


dat &lt;- data.frame(
  A = c(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;),
  B = c(&quot;x&quot;, &quot;y&quot;, &quot;z&quot;),
  NotUsed = c(1, 2, 3))


frml &lt;- ~ A + B + A:B
tf &lt;- terms.formula(frml)


tvars &lt;- attr(tf, &quot;variables&quot;)
used &lt;- lapply(eval(tvars, envir = dat), as.factor)
names(used) &lt;- rownames(attr(tf, &quot;factors&quot;))


tlabs &lt;- attr(tf, &quot;term.labels&quot;)

lapply(tlabs, function(tlab){
  droplevels(lazy_eval(as.lazy(tlab), data = used))
})

Please pay attention to how a grouped the code lines.
A Better Way
Regarding a better way, for which you have asked, I would propose the following.
dat &lt;- data.frame(A = c(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;),
                  B = c(&quot;x&quot;, &quot;y&quot;, &quot;z&quot;),
                  NotUsed = c(1, 2, 3))

dat &lt;- subset(x = dat, select = -NotUsed)

dat$c &lt;- as.factor(paste(dat$A, dat$B, sep = &quot;:&quot;))

my.list &lt;- lapply(dat,
                  FUN = function(column)
                  {
                      return(column)
                  })

In my view, this is a better way because it expresses your intention better. If you would have given me your code without any comments I would have a hard time explaining what it does or what it's purpose is. In addition, it does not require an additional package.
HTH!