2

我喜欢在窗口中弹出结果,以便更容易查看和查找(例如,当控制台继续滚动时,它们不会丢失)。一种方法是使用sink()and file.show()。例如:

y <- rnorm(100); x <- rnorm(100); mod <- lm(y~x)
sink("tempSink", type="output")
summary(mod)
sink()
file.show("tempSink", delete.file=T, title="Model summary")

我通常这样做是为了检查模型拟合,如上所述,但也适用于各种其他功能和对象,例如:summary(data.frame)anova(model1, model2)table(factor1, factor2)。这些很常见,但也可能出现其他情况。这里的要点是函数和对象的性质都可以变化。

每次都输入以上所有内容有点乏味。我想编写一个可以调用的更简单的函数,如下所示:

sinkShow <- function(obj, fun, title="output") {
    sink("tempSink", type="output")
    apply(obj, ?, fun)
    sink()
    file.show("tempSink", delete.file=T, title=title)
}

显然,这是行不通的。有几个问题。首先,您将如何做到这一点,以便它不会因错误类型的对象或函数而崩溃,而不必拥有条件执行列表(即if(is.list(obj) { lapply...)。其次,我不确定如何处理margin争论。最后,即使我尝试简单、人为的例子,我知道一切都设置得当,这也不起作用,所以似乎有一些根本性的错误。

有谁知道如何简单轻松地处理这种情况?我对 R 并不陌生,但我从未被正式教授过;我以一种特别的方式学会了技巧,也就是说,我不是一个非常成熟的 R 程序员。谢谢。

4

2 回答 2

5

而不是使用apply我认为你想要do.call的 . 确保将其包装在 a 中,print因为它位于函数内部。

这是一种可能的实现:

sinkShow <- function( obj, fun, title='Output', ...) {
    file <- tempfile()
    args <- c(list(obj),list(...))

    capture.output( do.call( fun, args ), file=file )
    file.show(file, delete.file=TRUE, title=title)
}

虽然它可能应该重命名,因为我也跳过了使用 sink。我可能会稍微修改一下并将其放入 TeachingDemos 包中。

于 2012-05-08T18:13:54.203 回答
4

使用page. 以下是一些示例模型:

d <- data.frame(y1=rnorm(100), y2=rnorm(100), x=rnorm(100))
mod <- lm(y1~x, data=d)
mods <- list(mod1=lm(y1~x, data=d), mod2=lm(y2~x, data=d))

以下是您的使用方法page

page(summary(mod), method="print")
page(lapply(mods, summary), method="print")

对于我的原始帖子,其中的代码被证明是 的近乎重新实现page,请参阅编辑历史记录。

于 2012-05-08T16:35:48.800 回答