[R] How to get variable names in a function?
Liaw, Andy
andy_liaw at merck.com
Wed Feb 9 01:26:57 CET 2005
Here's a (rather ugly) function that takes its arguments and turn them into
a list, using the names of the arguments and the names of the components:
listWithName <- function(...) {
aname <- sapply(as.list(substitute({...})[-1]), deparse)
res <- list(...)
names(res) <- aname
res
}
Here are a couple of examples:
> x <- runif(5)
> y <- "abc"
> listWithName(x, y)
$x
[1] 0.44241647 0.07540958 0.46405311 0.01684738 0.94370893
$y
[1] "abc"
> listWithName(x, 1:3, y)
$x
[1] 0.44241647 0.07540958 0.46405311 0.01684738 0.94370893
$"1:3"
[1] 1 2 3
$y
[1] "abc"
> listWithName(abc=x, y)
$x
[1] 0.44241647 0.07540958 0.46405311 0.01684738 0.94370893
$y
[1] "abc"
You can then use lapply() on the output. lapply() will automatically attach
names to the components of its output.
Andy
> From: Heinz Tuechler
>
> At 10:32 08.02.2005 -0800, Berton Gunter wrote:
> >If you pass your function a NAMED list, then the following works:
> >
> >demofn<-function(varlist)
> >{
> > nm<-names(varlist)
> > for (i in seq(along=varlist))
> > {cat('\n',nm[i])
> > print(table(varlist[[i]]))
> > }
> >}
> >demofn(list(bravo=bravo, charly=charly))
> >
> >If you don't pass a named list, then you need to restrict
> and know the form
> >of the expression that is the varlist argument in order to
> substitute() and
> >deparse it correctly to get the identifiers you want. For
> example, if you
> >knew that varlist were an expression of the form:
> >list(var1,var2,var3,...)
> >then you could get the ith identifier vari via:
> >
> >deparse((as.list(substitute(varlist))[-1])[[i]])
> >
> >HOWEVER, this is probably inefficient and **clearly**
> clumsy, undesirable,
> >and almost certain to fail (so don't do this!).
> >
> >If the number of tables is small enough that you could
> simply list them as
> >arguments (as opposed to constructing the list of vectors to
> be tabled in
> >some way), then the function call could be of the form
> function(...) and the
> >... arguments could be processed as discussed in section 3.1
> of V&R's S
> >PROGRAMMING. That is, your example call would be of the form:
> >demofn(bravo,charly), and you can forgo lists in the call
> altogether. This
> >strategy actually also works for long constructed lists of
> arguments using
> >do.call() -- see it's help file and V&R again for details.
> >
> >
> >-- Bert Gunter
> >Genentech Non-Clinical Statistics
> >South San Francisco, CA
> >
> >"The business of the statistician is to catalyze the
> scientific learning
> >process." - George E. P. Box
> >
> Thank you for your detailled answer. I see that it is not as easy as I
> expected and I will think about a convenient way to do it.
> I tried also the opposit approach i.e. to pass a vector of
> names to the
> function like c("bravo", "charly") but until now I did not
> solve it either.
> A third way worked, but seemed to me less generally applicable.
> I stored all the names of the variables of a data.frame in a
> vector, made
> the selection of the variables by match() and passed the
> indices of the
> selected variables to the function. By this method I can then
> access each
> variable by its index and also its name via the vector of the
> stored names.
> It seemed to me a crude method of a beginner like me and I
> still hope to
> find a better one.
> Your suggestion with the named list may be the best, if I
> find a practical
> way to produce this named list by some function from a simple
> list without
> retyping each name.
>
> Thanks again,
>
> Heinz
> >
> >
> >> -----Original Message-----
> >> From: r-help-bounces at stat.math.ethz.ch
> >> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of
> Heinz Tuechler
> >> Sent: Tuesday, February 08, 2005 8:45 AM
> >> To: r-help at stat.math.ethz.ch
> >> Subject: [R] How to get variable names in a function?
> >>
> >> Hello,
> >>
> >> applying a function to a list of variables I face the
> >> following problem:
> >> Let's say I want to compute tables for several variables. I
> >> could write a
> >> command for every single table, like
> >> bravo<-c(1,1,2,3,5,5,5,);charly<-c(7,7,4,4,2,1)
> >> table(bravo); table(charly)
> >> > table(bravo); table(charly)
> >> bravo
> >> 1 2 3 5
> >> 2 1 1 3
> >> charly
> >> 1 2 4 7
> >> 1 1 2 2
> >> The results are two tables with the names of the variables
> above each.
> >> If I want to do the same thing by a function I find no way
> to get the
> >> variable names above the tables.
> >> demofn<-function(varlist)
> >> {for (i in seq(along=varlist))
> >> {cat(deparse(varlist[i])) # < - - - - how to change this?
> >> print(table(varlist[i]))}}
> >> > demofn(list(bravo, charly))
> >> list(c(1, 1, 2, 3, 5, 5, 5))
> >> 1 2 3 5
> >> 2 1 1 3
> >> list(c(7, 7, 4, 4, 2, 1))
> >> 1 2 4 7
> >> 1 1 2 2
> >> >
> >>
> >> Thanks,
> >> Heinz Tüchler
> >>
> >> ______________________________________________
> >> R-help at stat.math.ethz.ch mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-help
> >> PLEASE do read the posting guide!
> >> http://www.R-project.org/posting-guide.html
> >>
> >
> >
> >
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
> http://www.R-project.org/posting-guide.html
>
>
More information about the R-help
mailing list