Thank you, John and David.

Yes someone already came up with that one on Stack Overflow.

Although I don't quite understand how it works - it would be nice to
see a step-by-step explanation of what is getting substituted and
evaluated in which environment. I guess 'eval.parent' must do its own
substituting, just so that it can see the variables you pass to it,
before it actually evaluates its argument. But 'eval' is .Internal...
Maybe if this is less of a mystery to someone else ...

Frederick

On Mon, Dec 12, 2016 at 02:54:14PM -0800, David Winsemius wrote:
> >...
> Exactly the same answer as the crossposting elicited:
> 
> http://stackoverflow.com/questions/41083293/in-r-how-do-i-define-a-function-which-is-equivalent-to-deparsesubstitutex
> 
> -- 
> David

On Mon, Dec 12, 2016 at 10:07:06PM +0000, Fox, John wrote:
> 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-boun...@r-project.org] On Behalf Of
> > frede...@ofb.net
> > Sent: December 11, 2016 8:35 PM
> > To: r-help@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, frede...@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@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@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@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.

Reply via email to