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. >
David Winsemius
2016-Dec-12 04:53 UTC
[R] how do I define a function which is equivalent to `deparse(substitute(x))`?
> 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
frederik at ofb.net
2016-Dec-12 05:55 UTC
[R] how do I define a function which is equivalent to `deparse(substitute(x))`?
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 >
Fox, John
2016-Dec-12 22:07 UTC
[R] how do I define a function which is equivalent to `deparse(substitute(x))`?
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.
David Winsemius
2016-Dec-12 22:54 UTC
[R] how do I define a function which is equivalent to `deparse(substitute(x))`?
> On Dec 12, 2016, at 2:07 PM, Fox, John <jfox at mcmaster.ca> 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) > logExactly 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> > 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. > > ______________________________________________ > 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
Bert Gunter
2016-Dec-12 23:41 UTC
[R] how do I define a function which is equivalent to `deparse(substitute(x))`?
*If* I understand correctly -- and please let me know if I don't -- this seems somewhat more straightforward and less "hacky" :> desub <- function(x) as.name(all.vars(sys.call(-1)))Yielding in the OP's example:> g <- function(y)desub(y) > g(log)log Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Mon, Dec 12, 2016 at 2:07 PM, Fox, John <jfox at mcmaster.ca> 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-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. > > ______________________________________________ > 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.