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

frederik at ofb.net frederik at ofb.net
Mon Dec 12 06:55:48 CET 2016


Thank you, that made me laugh :)

On Sun, Dec 11, 2016 at 08:53:42PM -0800, David Winsemius wrote:
> 
> > On Dec 11, 2016, at 5:35 PM, frederik at ofb.net wrote:
> > 
> > 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...
> 
> From a typical US 10th grade English assignment:
> 
> Cassius:
> "The fault, dear Brutus, is not in our stars,
> But in ourselves, that we are underlings."
> 
> -- 
> David.
> > 
> > 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-function-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.
> 
> David Winsemius
> Alameda, CA, USA
>



More information about the R-help mailing list