Re: R-beta: Help accessing variable from a formula

Thomas Lumley (
Mon, 3 Nov 1997 09:21:16 -0800 (PST)

Date: Mon, 3 Nov 1997 09:21:16 -0800 (PST)
From: Thomas Lumley <>
To: Murray Keir <>
Subject: Re: R-beta: Help accessing variable from a formula
In-Reply-To: <>

On Sat, 1 Nov 1997, Murray Keir wrote:
> I have a program which is being feed a formula.  One of the terms in 
> the formula is going to be r(variablename).  r just returns the 
> original variable.
> r <- function(x) x
> The formula is something like 
> rglm(y ~ x + r(Subject))
> What I want to do is get access to the variable Subject directly.  Can 
> anyone give me any suggestions for doing this?

The terms() command contains some magic for doing this 
If you type
	R> Terms<-terms(y ~ x + r(Subject),specials="r")
the resulting terms object has an attribute "specials" 
	R> attr(Terms,"specials")$r
	[1] 3
which says that the third column of the model frame will contain the r()
term. Multiple terms are possible
        R> Terms<-terms(y ~ x + r(Subject)+r(Object),specials="r")
        R> attr(Terms,"specials")$r
	[1] 3 4

You may then want to remove the r() from the formula before calling
model.matrix().  This is a bit harder, but there is code in the survival4
package to do it.  The function untangle.specials() gives the position of
the r() in the right-hand side of the formula object, and the survival4
package contains a "[.terms" method that allows terms to be removed
	R> untangle.specials(Terms,"r")
	[1] "r(Subject)" "r(Object)" 

	[1] 2 3
	R> Terms<-Terms[-c(2,3)]
	R> Terms
	y ~ x
	list(y, x)
	y 0
	x 1
  and so on...

If you want to include the code for untangle.specials() in your own
package you should probably ask Terry Therneau for permission -- the
survival4 code is not GPL -- but I imagine he would be happy for it to be
used with acknowledgement. I wrote the "[.terms" method, so there's no
problem there. 

Thomas Lumley
Biostatistics		: "Never attribute to malice what  :
Uni of Washington	:  can be adequately explained by  :
Box 357232		:  incompetence" - Hanlon's Razor  :
Seattle WA 98195-7232	:				   :

r-help mailing list -- Read
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: