On Fri, 5 Mar 2010, Ravi Varadhan wrote:

Hi,

I would like to write a function which has the following syntax:

myfn <- function(formula, ftime, fstatus, data) {
# step 1: obtain terms in `formula' from dataframe `data'
# step 2: obtain ftime from `data'
# step 3:  obtain fstatus from `data'
# step 4: do model estimation
# step 5: return results
}

The user would call this function as:

myfn(formula=myform, ftime=myftime, fstatus=myfstatus, data=mydata)

Where `myform' is a formula object; and the terms in `myform', and the 
variables `myftime' and `myfstatus' should be obtained from the dataframe 
`mydata'.

I am getting tripped up in trying to figure out how to do the seemingly simple 
steps of 1, 2, and 3.


I don't think steps 2 and 3 are a good idea as written -- I would strongly 
advocate that all variables to be looked up in the data frame should be 
supplied as formulas so that it is clear they are not being evaluated according 
to the usual rules.  Many existing functions work the way you suggest, but I 
still think it's unclear and makes it harder to use them in programs.

Having said that, you can use

   mf <- match.call(expand.dots = FALSE)
    m <- match(c("formula", "data", "ftime", "fstatus"), names(mf), 0)
    mf <- mf[c(1, m)]
    mf$drop.unused.levels <- TRUE
    mf[[1]] <- as.name("model.frame")
    mf <- eval.parent(mf)

to create a model frame that will contain the variables in the formula, and 
columns `(ftime)` and `(fstatus)` for the other arguments.


If you use formulas for ftime and fstatus you would have to call model.frame() 
multiple times, which is a bit more work. You would also need to use 
na.action=na.pass() to let through any missing data and then remove missing 
data after you have all three variables.


      -thomas

Thomas Lumley                   Assoc. Professor, Biostatistics
tlum...@u.washington.edu        University of Washington, Seattle

______________________________________________
R-help@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.

Reply via email to