A fun discussion, but to get back to Thomas's too clever by half comment that started
this, I went through some of these same thoughts a few years ago. I ended up asking the
deeper question
"Why DO I want to fix this? It was a bad idea from the start."
I once had a similar self-conversation about a 1976 Mercury Comet. (One of the more rapid
automobile-hate relationships I've developed).
Terry T.
On 03/07/2014 10:24 AM, William Dunlap wrote:
It's not possible to be perfect in this scenario, but you could use
some heuristics:
survfit <- function(x, ...) {
xq <- substitute(x)
if (!is.call(xq)) {
stop("First argument to survfit must be a function call")
}
It would be good to add another logical argument, say substitute=TRUE or FALSE,
to let the caller avoid those heuristics and say exactly what is wanted. C.f.
library's
character.only argument.
Bill Dunlap
TIBCO Software
wdunlap tibco.com
-----Original Message-----
From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On
Behalf
Of Hadley Wickham
Sent: Friday, March 07, 2014 7:46 AM
To: Therneau, Terry M., Ph.D.
Cc: R-help; Thomas Lumley
Subject: Re: [R] Survfit error
On Fri, Mar 7, 2014 at 6:46 AM, Therneau, Terry M., Ph.D.
<thern...@mayo.edu> wrote:
The help page for the survfit function says it expects a formula as its
first argument so try:
sleepfit <- survfit(Surv(timeb, death)~1, data = sleep)
David
Sent from my iPhone ... so unable to test.
This was a recent (well, 2007) change in behaviour. Previously the
function
did some tricks to make either approach work, which could be described as
'clever' or 'too clever by half'.
-thomas
Certainly the latter, a design mistake that I finally admitted and
corrected. The trouble is this usage
fit <- survfit(Surv(time, status), data=mine)
The data, subset, weights, and na.action arguments are all meant to work
with formulas. The first argument above isn't a formula. This left survfit
with the quandry of how to recognize that the first argument is a "Surv"
object and not a formula, and do something differently. Which leads to a
stalemate
a. One doesn't know what type of object the first argument is until
it is evaluated
b. Evaluation will fail, however, unless it is evaluated in the
"data=mine" context
c. The function that does that process (model.frame) expects a
formula as its first arg
My program needed to know the answer to a) in order to transform the first
arg into a formula and correctly execute c), but needed the answer from c)
to know if that was necessary.
The old code peeked back at the actual string that was typed by the user,
looking for the letters "Surv", but was easily fooled.
It's not possible to be perfect in this scenario, but you could use
some heuristics:
survfit <- function(x, ...) {
xq <- substitute(x)
if (!is.call(xq)) {
stop("First argument to survfit must be a function call")
}
if (identical(xq[[1]], quote(Surv))) {
"surv"
} else if (identical(xq[[1]], quote(`~`))) {
"formula"
} else {
"don't know"
}
}
survfit(Surv(time, status), data=mine)
survfit(Surv(timeb, death)~1, data = sleep)
You'd need a different heuristic if is.name(xq) is TRUE, indicating
that the user passed in the name of an existing variable.
Hadley
--
http://had.co.nz/
______________________________________________
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.
______________________________________________
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.