Re: [R] using "eval(parse(text)) " , gsub(pattern, replacement, x) , to process "code" within a loop/custom function

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Fri, 7 Dec 2007 13:41:48 -0500

Use the same names (births, temp, ...) in each Rdata file and then load each file into its own environment or proto object:

	library(proto); x1951 <- proto() # or x1951 <- new.env()
	load("1951.rda", envir = x1951)

Then pass the environment or proto object to each of your functions:

	f <- function(x) x$difference <- x$births - x$temp
	f(x1951)

The above completely avoids renaming variables and instead treats each year as an object. If you use proto objects the home page is: http://r-proto.googlecode.com

On Dec 6, 2007 12:10 PM, Thomas Pujol <thomas.pujol_at_yahoo.com> wrote:
> R-help users,
> Thanks in advance for any assistance ... I truly appreciate your expertise. I searched help and could not figure this out, and think you can probably offer some helpful tips. I apologize if I missed something, which I'm sure I probably did.
>
> I have data for many "samples". (e.g. 1950, 1951, 1952, etc.)
>
> For each "sample", I have many data-frames. (e.g. temp.1952, births.1952, gdp.1952, etc.)
>
> (Because the data is rather "large" (and for other reasons), I have chosen to store the data as individual files, as opposed to a list of data frames.)
>
> I wish to write a function that enables me to "run" any of many custom "functions/processes" on each sample of data.
>
> I currently accomplish this by using a custom function that uses:
> "eval(parse(t=text.i2)) ", and "gsub(pat, rep, x)" (this changes the "sample number" for each line of text I submit to "eval(parse(t=text.i2))" ).
>
> Is there a better/preferred/more flexible way to do this?
>
> One issue/obstacle that I have encountered: Some of the custom functions I use need to take as input the value of "d" in the loop below.
> (Please see the sample function "fn.mn.d" below.)
>
> #creates sample data
> temp.1951 <- c(11,13,15)
> births.1951 <- c(123, 156, 178)
> temp.1952 <- c(21,23,25)
> births.1952 <- c(223, 256, 278)
> #######################
> #function that looks for a a pattern "pat.i" within "x", and replaces it with "rep"
> recurse <- function(x, pat.i,rep.i) {
> f <- function(x,pat,rep) if (mode(x) == "character") gsub(pat, rep, x) else x
> if (length(x) == 0) return(x)
> if (is.list(x)) for(i in seq_along(x)) x[[i]] <- recurse(x[[i]], pat.i,rep.i)
> else x <- f(x,pat.i,rep.i)
> x
> #f <- function(x) if (mode(x) == "character") gsub("a", "green", x) else x
> }# end recurse end
> #######################
> #######################
> #function that processes code submitted as "text.i" for each date in "dates.i"
> fn.dateloop <- function(text.i, dates.i ) {
> for(d in 1: length(dates.i) ) {
> tempdate <- dates.i[d]
> text.i2 <- recurse(text.i, pat.i='#', rep.i=tempdate)
> temp0=eval(parse(t=text.i2))
> tempname <- paste(names(temp0)[1], tempdate, sep='.')
> save(list='temp0', file = tempname)
> } # next d
> } # end fn.dateloop
> #######################
> #####################
> #a sample custom function that I want to run on each sample of data
> fn.mn <- function(x, y) {
> res = x - y
> names(res) = 'mn'
> res
> }
> #####################
> #####################
> #example of function that takes d as input...
> #I have not been able to get this to work with the custom function "fn.dateloop" above
> #I request assistance in learning how to accomplish this
> fn.mn.d <- function(x, y, d) {x[d] - y[d]}
> #####################
> #####################
> setwd('c:/') #specifies location where sample data will be saved
> getwd() #checks location
> fn.mn(x=temp.1951, y=births.1951)
> fn.mn(x=temp.1952, y=births.1952)
> #
> fn.dateloop(text.i = "fn.mn(x=get('temp.#'), y=get('births.#') )" , dates.i=c('1951','1952') )
> get(load('mn.1951'))
> get(load('mn.1952'))
>
>
>
>
>
> ---------------------------------
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> 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.
>



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. Received on Fri 07 Dec 2007 - 18:50:18 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 07 Dec 2007 - 19:30:20 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.