[R] Using eval() more efficiently?

Gabor Grothendieck ggrothendieck at myway.com
Mon Sep 20 03:03:04 CEST 2004

```

glm( Cross ~., all.df[,c("Cross", names.select)], family = binomial)

---

From:   	Kevin Wang <Kevin.Wang at maths.anu.edu.au>

Hi,

Suppose I have a vector:
> names.select
[1] "Idd13" "Idd14" "Idd8.12" "Idd7"
automatically generated by some selection criteria.

Now, if I have a data frame with many variables, of which the variables in
"names.select" are also variables from the data frame. e.g.
> all.df[1:5,]
Mouse Idd5 Idd6.19.20 Idd13 Idd14 Idd8.12 Idd3.10.17.18 Idd9
1 904 F1 NOD NOD F1 NOD F1 NOD
2 934 NOD F1 F1 F1 F1 NOD NOD
3 950 NOD NOD F1 NOD F1 F1 NOD
4 977 F1 NOD NOD F1 F1 F1 F1
5 1050 F1 F1 NOD NOD NOD NOD F1
Idd15 Idd7 Idd2 Aire Idd4 Idd21 Cross
1 F1 NOD NOD NOD NOD NOD 1
2 NOD NOD F1 F1 NOD F1 1
3 NOD NOD F1 F1 NOD NOD 1
4 NOD F1 NOD NOD NOD NOD 1
5 NOD F1 F1 F1 NOD F1 1

If I want to use the information from names.select to fit a glm() on
Cross, I can do something like:
> one.glm2 <- glm(eval(substitute(Cross ~ x1 + x2 + x3 + x4,
+ list(x1 = as.name(names.select[1]),
+ x2 = as.name(names.select[2]),
+ x3 = as.name(names.select[3]),
+ x4 =
as.name(names.select[4])))),
+ data = all.df, family = binomial)
which does exactly what I want.

However, this is kind of inefficient as if my selection criteria change,
the variables being selected in names.select may change and it will make
my eval() from one.glm2 invalid.

Is there a way to solve this? e.g. if names.select has got 5 elements
then I'd want to fit something like:
one.glm2 <- glm(eval(substitute(Cross ~ x1 + x2 + x3 + x4 + x5,
list(x1 = as.name(names.select[1]),
x2 = as.name(names.select[2]),
x3 = as.name(names.select[3]),
x4 = as.name(names.select[4]),
x5 = as.name(names.select[5])))),
data = all.df, family = binomial)

(What I'm doing is writing a function which let's the user determine a
selection criteria, hence names.select will be unknown -- and so far I'm
very puzzled about how I can then use the information in names.select into
my one.glm2...*_*.

```