[R] how do I define a function which is equivalent to `deparse(substitute(x))`?

Fox, John jfox at mcmaster.ca
Mon Dec 12 23:07:06 CET 2016


Dear Frederick,

I found this a challenging puzzle, and it took me awhile to come up with an alternative, and I think slightly simpler, solution:

> desub <- function(y) {
+     deparse(eval(substitute(substitute(y)), 
+                  env=parent.frame()))
+ }
 
> f <- function(x){
+     message(desub(x))
+ }

> f(log)
log

Best,
 John

-----------------------------
John Fox, Professor
McMaster University
Hamilton, Ontario
Canada L8S 4M4
Web: socserv.mcmaster.ca/jfox




> -----Original Message-----
> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of
> frederik at ofb.net
> Sent: December 11, 2016 8:35 PM
> To: r-help at r-project.org
> Subject: Re: [R] how do I define a function which is equivalent to
> `deparse(substitute(x))`?
> 
> Dear R-Help,
> 
> I was going to ask Jeff to read the entire works of William Shakespeare to learn
> why his reply was not helpful to me...
> 
> Then I realized that the answer, as always, lies within...
> 
>     desub <- function(y) {
>       e1=substitute(y, environment())
>       e2=do.call(substitute,list(e1), env=parent.frame())
>       deparse(e2)
>     }
> 
> Sorry to trouble the list; other solutions still welcome.
> 
> Cheers,
> 
> Frederick
> 
> On Sun, Dec 11, 2016 at 12:46:23AM -0800, Jeff Newmiller wrote:
> > No. Read Hadley Wickham's "Advanced R" to learn why not.
> > --
> > Sent from my phone. Please excuse my brevity.
> >
> > On December 10, 2016 10:24:49 PM PST, frederik at ofb.net wrote:
> > >Dear R-Help,
> > >
> > >I asked this question on StackOverflow,
> > >
> > >http://stackoverflow.com/questions/41083293/in-r-how-do-i-define-a-fu
> > >nction-which-is-equivalent-to-deparsesubstitutex
> > >
> > >but thought perhaps R-help would be more appropriate.
> > >
> > >I want to write a function in R which grabs the name of a variable
> > >from the context of its caller's caller. I think the problem I have
> > >is best understood by asking how to compose `deparse` and `substitute`.
> > >You can see that a naive composition does not work:
> > >
> > >    # a compose operator
> > >    >  `%c%` = function(x,y)function(...)x(y(...))
> > >
> > >    # a naive attempt to combine deparse and substitute
> > >    > desub = deparse %c% substitute
> > >    > f=function(foo) { message(desub(foo)) }
> > >    > f(log)
> > >    foo
> > >
> > >    # this is how it is supposed to work
> > >    > g=function(foo) { message(deparse(substitute(foo))) }
> > >    > g(log)
> > >    log
> > >
> > >Is there a way I can define a function `desub` so that `desub(x)` has
> > >the same value as `deparse(substitute(x))` in every context?
> > >
> > >Thank you,
> > >
> > >Frederick Eaton
> > >
> > >______________________________________________
> > >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > >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.
> >
> 
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.



More information about the R-help mailing list