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