如何使用函数和*apply查看文件中的结果?

gun*_*ica 2 r apply

我喜欢在窗口中弹出结果,以便更容易查看和查找(例如,当控制台继续滚动时,它们不会丢失).一种方法是使用sink()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")
Run Code Online (Sandbox Code Playgroud)

我经常这样做是为了检验模型拟合,如上述,也为各种各样的其他功能和对象,如: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)
}
Run Code Online (Sandbox Code Playgroud)

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

有谁知道如何简单轻松地处理这种情况?我不是R的新手,但我从来没有正式教过它; 我以特别的方式选择了技巧,即我不是一个非常复杂的R程序员.谢谢.

Gre*_*now 5

而不是使用apply我认为你想要的do.call.确保将其包装在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)
}
Run Code Online (Sandbox Code Playgroud)

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