如何控制R中函数的输出(类似于lm)

ped*_*ram 5 r

我在R中创建一个自定义函数,它将一些不同的变量作为输入,并创建一个data.frame,一个图和一些汇总统计数据,所有这些都存储在一个列表中.我只想在调用函数时打印出摘要统计信息,但在显式调用时可以使用plot和data.frame.

我认为我想要的是如何lm()操作,但我不确定它是如何实现的.

当我打印lm我返回的对象时,只得到打印输出$call$coefficients:

lm(mtcars$mpg ~ mtcars$cyl)

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

Coefficients:
(Intercept)   mtcars$cyl  
     37.885       -2.876  
Run Code Online (Sandbox Code Playgroud)

但是在幕后显然,函数调用中有更多可用的东西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
Run Code Online (Sandbox Code Playgroud)

我查看了lm的代码但是我不太清楚发生了什么.

小智 9

调用的结果lm是一个对象,其class属性设置为lm.此类的对象具有自己的打印方法(如果要使用,可以显式调用print.lm).只需设置函数返回的对象的class属性,然后编写自己的print方法,就可以自己做类似的事情.这是一个例子:

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)
Run Code Online (Sandbox Code Playgroud)

因为列表a具有设置为的类属性my_list,所以一旦为其创建了打印方法,只要您使用该类打印列表,就会使用此方法.您可以通过显式调用来查看整个对象print.default.R中有关于类的非常好的解释:http://adv-r.had.co.nz/OO-essentials.html.