On 18/06/2014 15:01, Bert Gunter wrote:
Would

f <- function (...)
{
   sapply(substitute(list(...)),deparse)[-1]
}

f(a1=log(1:4), m1=1:4, c1=pi)
         a1         m1         c1
"log(1:4)"      "1:4"       "pi"

be equivalent?
I find the substitute(...()) construction completely mysterious, while
substitute(list(...)) makes sense to me.

It would give the same result. If starting from scratch I would probably have used

f <- function(...) as.character(match.call()[-1])

but that does not give names (if wanted) whereas

f <- function(...) sapply(match.call(), deparse)[-1]

does


My main point was that a for() loop (and extending a logical vector initialized to NA and then coerced to character) seems rather unnatural. And seq_along would be clearer if you really must use a loop.


Cheers,
Bert




Bert Gunter
Genentech Nonclinical Biostatistics
(650) 467-7374

"Data is not information. Information is not knowledge. And knowledge
is certainly not wisdom."
Clifford Stoll




On Wed, Jun 18, 2014 at 5:41 AM, Prof Brian Ripley
<rip...@stats.ox.ac.uk> wrote:
On 18/06/2014 12:54, Jim Lemon wrote:

On Wed, 18 Jun 2014 04:24:58 PM yzh lin wrote:

Hi, every R user,

     I wanna output  names of objects, I googled codes from website,

but it

was not what I wanted.

the codes are as following:

f <- function (...)
{
    unevaluatedArgs <- substitute(...())
    evaluatedArgs <- list(...)
    stopifnot(length(unevaluatedArgs) == length(evaluatedArgs))
    tags <- vapply(unevaluatedArgs, FUN=function(x) deparse(x)[1],
                   FUN.VALUE=character(1))
    if (!is.null(tmp <- names(evaluatedArgs))) {
      # if argument is tagged, tag=expr, use the tag
      i <- !is.na(tmp) & tmp != ""
      tags[i] <- tmp[i]
    }
    tags
}

f(a1=log(1:4), m1=1:4, c1=pi)

results:

f(a1=log(1:4), m1=1:4, c1=pi)


    a1   m1   c1
"a1" "m1" "c1"


what I wanted is outputting "log(1:4) " "1:4", "pi" , while not "a1" "m1"
"c1" .

Coulde someone tell me how to get the results I wanted?

Hi Yuanzhen,
This may be of some help:

f<-function (...) {
    unevaluatedArgs <- unlist(substitute(...()))
    tags<-NA
    for(arg in 1:length(unevaluatedArgs))
     tags[arg]<-deparse(unevaluatedArgs[[arg]])
    tags
}

f(a1=log(1:4), m1=1:4, c1=pi)
[1] "log(1:4)" "1:4"      "pi"


Or simply

f <- function(...) sapply(subsitute(...()), deparse)

which even keeps the names.

--
Brian D. Ripley,                  rip...@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


--
Brian D. Ripley,                  rip...@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to