Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

using substitute to get argument name with

Tags:

r

I'm trying to get the names of arguments in the global environment within a function. I know I can use substitute to get the name of named arguments, but I would like to be able to do the same thing with ... arguments. I kinda got it to work for the first element of ... but can't figure out how to do it for the rest of the elements. Any idea how to get this working as intended.

foo <- function(a,...) {     print(substitute(a))     print(eval(enquote(substitute(...))))     print(sapply(list(...),function(x) eval(enquote(substitute(x)),env=.GlobalEnv))) }  x <- 1 y <- 2 z <- 3 foo(x,y,z)  x y [[1]] X[[1L]]  [[2]] X[[2L]] 
like image 341
darckeen Avatar asked Apr 22 '11 10:04

darckeen


2 Answers

The canonical idiom here is deparse(substitute(foo)), but the ... needs slightly different processing. Here is a modification that does what you want:

foo <- function(a, ...) {     arg <- deparse(substitute(a))     dots <- substitute(list(...))[-1]     c(arg, sapply(dots, deparse)) }  x <- 1 y <- 2 z <- 3  > foo(x,y,z) [1] "x" "y" "z" 
like image 101
Gavin Simpson Avatar answered Sep 21 '22 14:09

Gavin Simpson


I would go with

foo <- function(a, ...) { print( n <- sapply(as.list(substitute(list(...)))[-1L], deparse) )     n } 

Then

foo(x,y,z) # [1] "y" "z" 

Related question was previously on StackOverflow: How to use R's ellipsis feature when writing your own function? Worth reading.


Second solution, using match.call

foo <- function(a, ...) {     sapply(match.call(expand.dots=TRUE)[-1], deparse) } 
like image 32
Marek Avatar answered Sep 21 '22 14:09

Marek