Kingsley G. Morse Jr.
2011-Mar-06 01:20 UTC
[R] Can body() return a function's body intact, in order, and as characters ready for editing?
Is my understanding correct that the body() function currently can't return a function's body intact, in order, and as characters ready for editing? My testing and reading of body()'s help indicate that it can not. Here's what I'm seeing. Consider pasting 1+ and a function containing x^2 together to get 1+x^2 As you can see below, body() reports three elements, out of order. > f<-function(x) x^2; b<-body(f); paste("1+",b, sep="") [1] "1+^" "1+x" "1+2 I realize that this might be worked around with something like > f<-function(x) x^2; b<-do.call(paste,as.list(c(deparse(body(f)),sep=""))); paste("1+",b, sep="") [1] "1+x^2" However, I'm asking a different question. Is my understanding correct that body() can't return a function's body intact, in order, and as characters ready for editing? Thanks, Kingsley> sessionInfo()R version 2.12.1 (2010-12-16) Platform: i486-pc-linux-gnu (32-bit) locale: [1] LC_CTYPE=en_US LC_NUMERIC=C LC_TIME=en_US [4] LC_COLLATE=en_US LC_MONETARY=C LC_MESSAGES=en_US [7] LC_PAPER=en_US LC_NAME=C LC_ADDRESS=C [10] LC_TELEPHONE=C LC_MEASUREMENT=en_US LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] optimx_0.88 setRNG_2009.11-1 minqa_1.1.13 Rcpp_0.9.2 [5] Rvmmin_2011-2.11 Rcgmin_2011-2.10 ucminf_1.0-5 BB_2011.2-1 [9] quadprog_1.5-3 numDeriv_2010.11-1 rgp_0.2-3 snowfall_1.84 [13] snow_0.3-3 rrules_0.1-0 emoa_0.4-3 loaded via a namespace (and not attached): [1] tcltk_2.12.1 tools_2.12.1> Sys.getlocale()[1] "LC_CTYPE=en_US;LC_NUMERIC=C;LC_TIME=en_US;LC_COLLATE=en_US;LC_MONETARY=C;LC_MESSAGES=en_US;LC_PAPER=en_US;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US;LC_IDENTIFICATION=C"
Gabor Grothendieck
2011-Mar-06 05:46 UTC
[R] Can body() return a function's body intact, in order, and as characters ready for editing?
On Sat, Mar 5, 2011 at 8:20 PM, Kingsley G. Morse Jr. <kingsley at loaner.com> wrote:> Is my understanding correct that the body() > function currently can't return a function's body > intact, in order, and as characters ready for > editing? > > My testing and reading of body()'s help indicate > that it can not. > > Here's what I'm seeing. > > Consider pasting > > ? ?1+ > > and a function containing > > ? ?x^2 > > together to get > > ? ?1+x^2 > > As you can see below, body() reports three > elements, out of order. > > ? ?> f<-function(x) x^2; b<-body(f); paste("1+",b, sep="") > ? ?[1] "1+^" "1+x" "1+2 > > I realize that this might be worked around with > something like > > ? ?> f<-function(x) x^2; b<-do.call(paste,as.list(c(deparse(body(f)),sep=""))); paste("1+",b, sep="") > ? ?[1] "1+x^2" > > However, I'm asking a different question. > > Is my understanding correct that body() can't > return a function's body intact, in order, and as > characters ready for editing? >body does not return character strings in the first place. It returns a language object. You are subsequently turning it into character strings and the problem occurs there. -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com
Duncan Murdoch
2011-Mar-06 10:44 UTC
[R] Can body() return a function's body intact, in order, and as characters ready for editing?
On 11-03-05 8:20 PM, Kingsley G. Morse Jr. wrote:> Is my understanding correct that the body() > function currently can't return a function's body > intact, in order, and as characters ready for > editing?Yes, that's not what body() returns. You can get what you want by printing the result of body(), e.g. capture.output(print(body(f))) However, your use of paste below isn't going to work on multi-line functions. Duncan Murdoch> > My testing and reading of body()'s help indicate > that it can not. > > Here's what I'm seeing. > > Consider pasting > > 1+ > > and a function containing > > x^2 > > together to get > > 1+x^2 > > As you can see below, body() reports three > elements, out of order. > > > f<-function(x) x^2; b<-body(f); paste("1+",b, sep="") > [1] "1+^" "1+x" "1+2 > > I realize that this might be worked around with > something like > > > f<-function(x) x^2; b<-do.call(paste,as.list(c(deparse(body(f)),sep=""))); paste("1+",b, sep="") > [1] "1+x^2" > > However, I'm asking a different question. > > Is my understanding correct that body() can't > return a function's body intact, in order, and as > characters ready for editing? > > Thanks, > Kingsley > >> sessionInfo() > R version 2.12.1 (2010-12-16) > Platform: i486-pc-linux-gnu (32-bit) > > locale: > [1] LC_CTYPE=en_US LC_NUMERIC=C LC_TIME=en_US > [4] LC_COLLATE=en_US LC_MONETARY=C LC_MESSAGES=en_US > [7] LC_PAPER=en_US LC_NAME=C LC_ADDRESS=C > [10] LC_TELEPHONE=C LC_MEASUREMENT=en_US LC_IDENTIFICATION=C > > attached base packages: > [1] stats graphics grDevices utils datasets methods base > > other attached packages: > [1] optimx_0.88 setRNG_2009.11-1 minqa_1.1.13 Rcpp_0.9.2 > [5] Rvmmin_2011-2.11 Rcgmin_2011-2.10 ucminf_1.0-5 BB_2011.2-1 > [9] quadprog_1.5-3 numDeriv_2010.11-1 rgp_0.2-3 snowfall_1.84 > [13] snow_0.3-3 rrules_0.1-0 emoa_0.4-3 > > loaded via a namespace (and not attached): > [1] tcltk_2.12.1 tools_2.12.1 > >> Sys.getlocale() > [1] "LC_CTYPE=en_US;LC_NUMERIC=C;LC_TIME=en_US;LC_COLLATE=en_US;LC_MONETARY=C;LC_MESSAGES=en_US;LC_PAPER=en_US;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US;LC_IDENTIFICATION=C" > > ______________________________________________ > R-help at r-project.org mailing list > 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.