Skip to content

How I() works in a formula

4 messages · Lorenz, David, Peter Dalgaard, Joris Meys

#
Dear all,

I'm updating a package regarding a new type of models, and I'm looking to
extend the formula interface with two functions (L() and R() ) for
construction of these models. I want to use as much of the formula
interface as possible, and hoped to do something similarly to I().

I know the I() function does nothing more than add the class "AsIs". I've
been browsing the source code of R for a couple of days now trying to
locate where this class assignment gets translated into a specific action,
but i couldn't locate it. I've been as far as the internal C function
modelframe.

Any pointers on how I() is processed internally are greatly appreciated.

Cheers
Joris
#
Joris,
  Basically, the I() function, as it is used in a regression model, allows
the user to perform arithmetic operations on a variable that would
otherwise be interpreted by the formula. It is not trapped as a special
function as Error() is in aov().
  There may be other applications where the class "AsIs" is needed, so
there are support functions for subscripting, formatting, printing and so
forth.
Dave
On Fri, Oct 3, 2014 at 7:32 AM, Joris Meys <jorismeys at gmail.com> wrote:

            

  
  
#
On 03 Oct 2014, at 14:32 , Joris Meys <jorismeys at gmail.com> wrote:

            
It isn't...
Call:
lm(formula = y ~ x + E(x^2))

Coefficients:
(Intercept)            x       E(x^2)  
     0.2757       0.1725      -0.3823  


The point is that special interpretation of operators never happens inside function calls. I() is just a convenient do-nothing function call.

If you want to add special operators, one place to look is in the handling of specials for survival::coxph.

  
    
#
Thanks Peter! That clarifies why it felt I was chasing ghosts these past
days :) Thanks for the tip about coxph as well, there's some nice ideas to
be discovered there.

Cheers
Joris
On Fri, Oct 3, 2014 at 3:02 PM, peter dalgaard <pdalgd at gmail.com> wrote: