我在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
但在幕后显然,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
我查看了lm的代码但是我不太清楚发生了什么。
答案 0 :(得分:8)
调用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)
由于列表a
的class属性设置为my_list
,因此一旦为其创建了打印方法,只要您使用该类打印列表,就会使用此方法。您可以通过显式调用print.default
来查看整个对象。 R中的类有一个非常好的解释:http://adv-r.had.co.nz/OO-essentials.html。