peter dalgaard
2015-Jan-29 11:11 UTC
[R] Passing a Data Frame Name as a Variable in a Function
On 29 Jan 2015, at 07:34 , Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote:> This approach is fraught with dangers. > > I recommend that you put all of those data frames into a list and have your function accept the list and the name and use the list indexing operator mylist[[DFName]] to refer to it. Having functions that go fishing around in the global environment will be hard to maintain at best, and buggy at worst.Agreed. However, just to help understand the issue: DFName is a length-one vector of character strings, not the object that has the name contained in the string. I.e. you can do nchar(DFName) and presumably get the value 7, but there is no operation on df.1001 that can tell you the length of its name. You can (but shouldn't, as per Jeff's note) get from name to object using get()/assign() and also via some concoctions involving combinations of eval(), parse(), as.name(), and substitute(). -- Peter Dalgaard, Professor, Center for Statistics, Copenhagen Business School Solbjerg Plads 3, 2000 Frederiksberg, Denmark Phone: (+45)38153501 Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
Much thanks to everyone for their recommendations! I agree that fishing in the global environment isn't ideal & only shows my budding understanding of R. For now, I will adapt Chel Hee's "length(eval(parse(text=DFName))[,1])" solution then fully explore Jeff's suggestion to put the data frames into a list. At best, I am implementing an ineloquent approach to: (1) Add a column to each data frame with a string that is parsed from the appendage of the data frame name, i.e., string is "1001" from data frame object of "df.1001"; then, (2) Bind the rows of all the files. Any more feedback will be much appreciated! Cheers, Alan On Jan 29, 2015, at 3:11 AM, peter dalgaard wrote:> > On 29 Jan 2015, at 07:34 , Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote: > >> This approach is fraught with dangers. >> >> I recommend that you put all of those data frames into a list and have your function accept the list and the name and use the list indexing operator mylist[[DFName]] to refer to it. Having functions that go fishing around in the global environment will be hard to maintain at best, and buggy at worst. > > Agreed. However, just to help understand the issue: > > DFName is a length-one vector of character strings, not the object that has the name contained in the string. I.e. you can do nchar(DFName) and presumably get the value 7, but there is no operation on df.1001 that can tell you the length of its name. You can (but shouldn't, as per Jeff's note) get from name to object using get()/assign() and also via some concoctions involving combinations of eval(), parse(), as.name(), and substitute(). > > -- > Peter Dalgaard, Professor, > Center for Statistics, Copenhagen Business School > Solbjerg Plads 3, 2000 Frederiksberg, Denmark > Phone: (+45)38153501 > Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com > > > > > > > >
Hadley Wickham
2015-Jan-29 20:36 UTC
[R] Passing a Data Frame Name as a Variable in a Function
On Thu, Jan 29, 2015 at 11:43 AM, Alan Yong <alanyong at caltech.edu> wrote:> Much thanks to everyone for their recommendations! I agree that fishing in the global environment isn't ideal & only shows my budding understanding of R. > > For now, I will adapt Chel Hee's "length(eval(parse(text=DFName))[,1])" solution then fully explore Jeff's suggestion to put the data frames into a list.If you have to go down this route, at least do nrow(get(DFName))> (1) Add a column to each data frame with a string that is parsed from the appendage of the data frame name, i.e., string is "1001" from data frame object of "df.1001"; then, > (2) Bind the rows of all the files.I'd highly recommend learning a little functional programming such as the use of lapply (e.g. http://adv-r.had.co.nz/Functionals.html). Then you can easily do: csvs <- dir(pattern = "\\.csv$") all <- lapply(csvs, read.csv) one <- do.call("rbind", all) to find all the csv files in a directory, load into a list and then collapse into a single data frame. You're much better off learning how to do this than futzing around with named objects in the global environment. Hadley -- http://had.co.nz/