> On Dec 5, 2016, at 7:29 AM, John Sorkin <jsor...@grecc.umaryland.edu> wrote: > > Rui, > I appreciate your suggestion, but eliminating the deparse statement does not > solve my problem. Do you have any other suggestions? See code below. > Thank you, > John > > > mydf <- > data.frame(id=c(1,2,3,4,5),sex=c("M","M","M","F","F"),age=c(20,34,43,32,21)) > mydf > class(mydf) > > > myfun <- function(frame,var){ > call <- match.call() > print(call) > > > indx <- match(c("frame","var"),names(call),nomatch=0) > print(indx) > if(indx[1]==0) stop("Function called without sufficient arguments!") > > > cat("I can get the name of the dataframe as a text string!\n") > #xx <- deparse(substitute(frame)) > print(xx) > > > cat("I can get the name of the column as a text string!\n") > #yy <- deparse(substitute(var)) > print(yy) > > > # This does not work. > print(frame[,var]) > > > # This does not work. > print(frame[,"var"]) > > > > > # This does not work. > col <- xx[,"yy"] > > > # Nor does this work. > col <- xx[,yy] > print(col) > } > > > myfun(mydf,age)
When you use that calling syntax, the system will supply the values of whatever the `age` variable contains. (And if there is no `age`-named object, you get an error at the time of the call to `myfun`. You need either to call it as: myfun( mydf , "age") # Or: age <- "age" myfun( mydf, age) Unless your value of the `age`-named variable was "age" in the calling environment (and you did not give us that value in either of your postings), you would fail. -- David. > > > > > myfun() > > > > > > > > > > > > > > > John David Sorkin M.D., Ph.D. > Professor of Medicine > Chief, Biostatistics and Informatics > University of Maryland School of Medicine Division of Gerontology and > Geriatric Medicine > Baltimore VA Medical Center > 10 North Greene Street > GRECC (BT/18/GR) > Baltimore, MD 21201-1524 > (Phone) 410-605-7119 > (Fax) 410-605-7913 (Please call phone number above prior to faxing) > >>>> Rui Barradas <ruipbarra...@sapo.pt> 12/05/16 10:17 AM >>> > Hello, > > You don't need xx <- deparse(substitute(...)), since you are passing the > data.frame to your function. Just use > > > myfun <- function(frame,var){ > > [...] > > # Nor does this work. > col <- frame[,yy] > print(col) > } > > myfun(mydf,age) > myfun(frame = mydf, var = age) > [1] 2 3 > I can get the name of the dataframe as a text string! > [1] "mydf" > I can get the name of the column as a text string! > [1] "age" > [1] 20 34 43 32 21 > > > Hope this helps, > > Rui Barradas > > > > Em 05-12-2016 14:44, John Sorkin escreveu: >> I am trying to write a function which, when passed the name of a dataframe >> and the name of a column of the dataframe, will allow me to work on the >> columns of a dataframe. I can not get my code to work. Please see the code >> below. Any help in getting the function to work would be appreciated. >> >> >> >> >> mydf <- >> data.frame(id=c(1,2,3,4,5),sex=c("M","M","M","F","F"),age=c(20,34,43,32,21)) >> mydf >> class(mydf) >> >> >> myfun <- function(frame,var){ >> call <- match.call() >> print(call) >> >> >> indx <- match(c("frame","var"),names(call),nomatch=0) >> print(indx) >> if(indx[1]==0) stop("Function called without sufficient arguments!") >> >> >> cat("I can get the name of the dataframe as a text string!\n") >> xx <- deparse(substitute(frame)) >> print(xx) >> >> >> cat("I can get the name of the column as a text string!\n") >> yy <- deparse(substitute(var)) >> print(yy) >> >> >> # This does not work. >> col <- xx[,"yy"] >> >> >> # Nor does this work. >> col <- xx[,yy] >> print(col) >> } >> >> >> myfun(mydf,age) >> >> John David Sorkin M.D., Ph.D. >> Professor of Medicine >> Chief, Biostatistics and Informatics >> University of Maryland School of Medicine Division of Gerontology and >> Geriatric Medicine >> Baltimore VA Medical Center >> 10 North Greene Street >> GRECC (BT/18/GR) >> Baltimore, MD 21201-1524 >> (Phone) 410-605-7119 >> (Fax) 410-605-7913 (Please call phone number above prior to faxing) >> >> >> >> >> John David Sorkin M.D., Ph.D. >> Professor of Medicine >> Chief, Biostatistics and Informatics >> University of Maryland School of Medicine Division of Gerontology and >> Geriatric Medicine >> Baltimore VA Medical Center >> 10 North Greene Street >> GRECC (BT/18/GR) >> Baltimore, MD 21201-1524 >> (Phone) 410-605-7119 >> (Fax) 410-605-7913 (Please call phone number above prior to faxing) >> >> >> >> >> >> Confidentiality Statement: >> This email message, including any attachments, is for the sole use of the >> intended recipient(s) and may contain confidential and privileged >> information. Any unauthorized use, disclosure or distribution is prohibited. >> If you are not the intended recipient, please contact the sender by reply >> email and destroy all copies of the original message. >> ______________________________________________ >> R-help@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. >> > > > > Confidentiality Statement: > This email message, including any attachments, is for ...{{dropped:15}} ______________________________________________ R-help@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.