[R] Survfit error
Therneau, Terry M., Ph.D.
therneau at mayo.edu
Fri Mar 7 19:12:11 CET 2014
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-bounces at r-project.org [mailto:r-help-bounces at 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.
>> <therneau at 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 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.
More information about the R-help
mailing list