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.
Fox, John
2016-Dec-12 23:58 UTC
[R] how do I define a function which is equivalent to `deparse(substitute(x))`?
Dear Bert, It's nitpicking, I guess, but the call to message() is in the original posting. Your solution produces> desub <- function(x) as.name(all.vars(sys.call(-1)))> f <- function(x){+ message(desub(x)) + }> f(log)x Best, John> -----Original Message----- > From: Bert Gunter [mailto:bgunter.4567 at gmail.com] > Sent: Monday, December 12, 2016 6:41 PM > To: Fox, John <jfox at mcmaster.ca> > Cc: frederik at ofb.net; r-help at r-project.org > Subject: Re: [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.
Bert Gunter
2016-Dec-13 00:25 UTC
[R] how do I define a function which is equivalent to `deparse(substitute(x))`?
John. et. al: I assumed the message call was there to convert a quoted string to an unquoted name and simply did this with as.name() in desub(). The point of using sys.call() is that you can go up the call stack as far as you need, so if you want to leave in the message() call, just go one farther up the call stack:> desub <- function(x) (all.vars(sys.call(-2))) ## note the -2 now> g <- function(y)message((desub(y))) > g(log)log -- 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 3:58 PM, Fox, John <jfox at mcmaster.ca> wrote:> Dear Bert, > > It's nitpicking, I guess, but the call to message() is in the original posting. Your solution produces > >> desub <- function(x) as.name(all.vars(sys.call(-1))) > >> f <- function(x){ > + message(desub(x)) > + } > >> f(log) > x > > Best, > John > >> -----Original Message----- >> From: Bert Gunter [mailto:bgunter.4567 at gmail.com] >> Sent: Monday, December 12, 2016 6:41 PM >> To: Fox, John <jfox at mcmaster.ca> >> Cc: frederik at ofb.net; r-help at r-project.org >> Subject: Re: [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.