Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I control the output of a function in R (similar to lm)

Tags:

r

I'm creating a custom function in R that takes as input a few different variables and creates a data.frame, a plot, and some summary stats, all stored in a list. I'd like to only print out the summary stats when calling the function, but have the plot and data.frame available when called explicitly.

I think what I want is similar to how lm() operates but I'm not sure how it is acheiving that.

When I print the object returned by lm I only get a printout of $call and $coefficients:

lm(mtcars$mpg ~ mtcars$cyl)

Call:
lm(formula = mtcars$mpg ~ mtcars$cyl)

Coefficients:
(Intercept)   mtcars$cyl  
     37.885       -2.876  

But clearly behind the scenes there is much more available in the function call to lm.

lm(mtcars$mpg[1:3] ~ mtcars$cyl[1:3])$residuals
            1             2             3 
-1.280530e-15  1.280530e-15  8.365277e-31 

> unclass(lm(mtcars$mpg[1:3] ~ mtcars$cyl[1:3])

Call:
lm(formula = mtcars$mpg[1:3] ~ mtcars$cyl[1:3])

Coefficients:
    (Intercept)  mtcars$cyl[1:3]  
           26.4             -0.9  


> unclass(lm(mtcars$mpg[1:3] ~ mtcars$cyl[1:3]))
$coefficients
    (Intercept) mtcars$cyl[1:3] 
           26.4            -0.9 

$residuals
            1             2             3 
-1.280530e-15  1.280530e-15  8.365277e-31 

$effects
    (Intercept) mtcars$cyl[1:3]                 
  -3.741230e+01    1.469694e+00    1.810943e-15 

....

$call
lm(formula = mtcars$mpg[1:3] ~ mtcars$cyl[1:3])

$model
  mtcars$mpg[1:3] mtcars$cyl[1:3]
1            21.0               6
2            21.0               6
3            22.8               4

I looked at the code for lm but it's not very clear to me what is going on.

like image 229
pedram Avatar asked May 25 '16 16:05

pedram


People also ask

What does lm () do in R?

The lm() function is used to fit linear models to data frames in the R Language. It can be used to carry out regression, single stratum analysis of variance, and analysis of covariance to predict the value corresponding to data that is not in the data frame.

Which function is used for creating a regression model from given formula lm () predict () Summary ()?

Summary: R linear regression uses the lm() function to create a regression model given some formula, in the form of Y~X+X2. To look at the model, you use the summary() function.


1 Answers

The result of a call to lm is an object with the class attribute set to lm. Objects of this class have their own print method (which you can call explicitly if you want using print.lm). You can do something similar yourself simply by setting the class attribute of the object returned by your function and then writing your own print method. Here's an example:

my.func <- function(x, y, z){
    library(ggplot2)
    df <- data.frame(x, y, z)
    p <- ggplot(df, aes(x, y)) + geom_point()
    ds <- sapply(df, summary)

    op <- list(data = df, plot = p, summary = ds)
    class(op) <- 'my_list'
    op
}

print.my_list <- function(m){
    print(m$summary)
}

a <- my.func(1:5, 5:1, rnorm(5))
a
print.default(a)

Because the list a has the class attribute set to my_list, once you have created a print method for it, this method is used whenever you print a list with that class. You can see the entire object by explicitly calling print.default. There is a very good explanation of classes in R here: http://adv-r.had.co.nz/OO-essentials.html.

like image 114
David_B Avatar answered Sep 22 '22 07:09

David_B