frederik at ofb.net
2016-Dec-11 06:24 UTC
[R] how do I define a function which is equivalent to `deparse(substitute(x))`?
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
Jeff Newmiller
2016-Dec-11 08:46 UTC
[R] how do I define a function which is equivalent to `deparse(substitute(x))`?
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.
frederik at ofb.net
2016-Dec-12 01:35 UTC
[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-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. >