8

Is there any way to create a vector of expressions in one line? I only know a two-liner with an ugly for-loop:

vexpr <- vector("expression", 7)
for(j in 1:7) vexpr[j] <- substitute(expression(italic(X[j.])), list(j.=j))[2]
Marius Hofert
  • 6,546
  • 10
  • 48
  • 102

1 Answers1

9
as.expression( sapply(1:7, function(x) bquote(italic(X[.(x)]))) )
#-----------
# expression(italic(X[1L]), italic(X[2L]), italic(X[3L]), italic(X[4L]), 
#    italic(X[5L]), italic(X[6L]), italic(X[7L]))

identical(vexpr, as.expression( sapply(1:7, function(x) bquote(italic(X[.(x)]))) ) )
#[1] TRUE

Also:

parse(text= paste("italic(X[", 1:7, "])", sep="") )  # fewer keystrokes
#--------
# expression(italic(X[1]), italic(X[2]), italic(X[3]), italic(X[4]), 
#    italic(X[5]), italic(X[6]), italic(X[7]))

(The second one will not pass the identical() test because it carries the heritage of its construction with it. I think these are byte-code side-effects, an enhancement that appears in R version 2.14.0, so it may appear differently in earlier versions. You can check this by applying str() to it. It does, however, pass the test of applying proper x-axis labels to plot(1:7, xaxt="n"); axis(1,at=1:7, labels=...) )

IRTFM
  • 258,963
  • 21
  • 364
  • 487
  • I vote for the `parse` approach only because `bquote( {something}.(x))` always makes my head hurt trying to remember what is in which environment :-) – Carl Witthoft Nov 26 '11 at 22:54
  • I thought `bquote` was a big advance over `substitute( , list(x=x) )` – IRTFM Nov 28 '11 at 16:02