简体   繁体   中英

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

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.

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 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM