当大物体填满屏幕时暂停打印

时间:2014-02-06 17:56:41

标签: r rstudio

说我想在R中打印一个大对象,例如

x <- 1:2e3

当我打印x时,R控制台用其元素填充屏幕,因为它不适合屏幕中的所有内容,它将向下滚动。然后我必须向上滚动以查看屏幕上的所有内容。

我想要的是有一个打印x的命令并在屏幕填充时停止,要求用户按顺序执行某些操作(例如按输入)有另一个显示数据的屏幕。我想到的是类似于MS DOS的dir /p命令。有这样的事吗?

正如@baptiste所建议的那样,this解决方案page(x, method = 'print')并没有真正解决我的问题。更清楚的是,我想要的是一种不涉及在另一个窗口中打印对象的解决方案,因为这会破坏我的工作流程。如果我不关心这个,我只会使用View()或类似的东西。

1 个答案:

答案 0 :(得分:6)

这是一个快速而肮脏的more函数:

more <- function(expr, lines=20) {
    out <- capture.output(expr)
    n <- length(out)
    i <- 1
    while( i < n ) {
        j <- 0
        while( j < lines && i <= n ) {
            cat(out[i],"\n")
            j <- j + 1
            i <- i + 1
        }
        if(i<n) readline()
    }
    invisible(out)
}

它将评估表达式和打印行的行(默认为20,但您可以更改它)。你需要按'enter'继续下一个块。只有'Enter'可以使用,你不能只使用空格键或其他程序,如其他程序,它没有搜索,返回等选项。

您可以使用以下命令进行尝试:

more( rnorm(250) )

这是一个扩展版本,如果您键入“q”或“Q”(或以任何一个开头的任何内容),然后按“Enter”,它将退出,如果输入,它将打印输出的最后lines行你键入'T'然后输入,如果你键入一个数字,它将通过输出跳转到那个十分位数(例如,输入5将跳到一半,8将是80%的通过)。还有别的东西,它会继续下去。

more <- function(expr, lines=20) {
    out <- capture.output(expr)
    n <- length(out)
    i <- 1
    while( i < n ) {
        j <- 0
        while( j < lines && i <= n ) {
            cat(out[i],"\n")
            j <- j + 1
            i <- i + 1
        }
        if(i<n){
            rl <- readline()
            if( grepl('^ *q', rl, ignore.case=TRUE) ) i <- n
            if( grepl('^ *t', rl, ignore.case=TRUE) ) i <- n - lines + 1
            if( grepl('^ *[0-9]', rl) ) i <- as.numeric(rl)/10*n + 1
        }
    }
    invisible(out)
}