[R] How to get variable names in a function?

Heinz Tuechler tuechler at gmx.at
Wed Feb 9 08:18:16 CET 2005


At 19:26 08.02.2005 -0500, Liaw, Andy wrote:
>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
>
Thank you very much, this looks promising to me. As soon as possible I will
try to apply it to my problem.

Heinz

>
>> 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
>> 
>> 
>
>
>---------------------------------------------------------------------------
---
>Notice:  This e-mail message, together with any attachments, contains
information of Merck & Co., Inc. (One Merck Drive, Whitehouse Station, New
Jersey, USA 08889), and/or its affiliates (which may be known outside the
United States as Merck Frosst, Merck Sharp & Dohme or MSD and in Japan, as
Banyu) that may be confidential, proprietary copyrighted and/or legally
privileged. It is intended solely for the use of the individual or entity
named on this message.  If you are not the intended recipient, and have
received this message in error, please notify us immediately by reply
e-mail and then delete it from your system.
>---------------------------------------------------------------------------
---
>
>




More information about the R-help mailing list