说我想在R中打印一个大对象,例如
x <- 1:2e3
当我打印x
时,R控制台用其元素填充屏幕,因为它不适合屏幕中的所有内容,它将向下滚动。然后我必须向上滚动以查看屏幕上的所有内容。
我想要的是有一个打印x
的命令并在屏幕填充时停止,要求用户按顺序执行某些操作(例如按输入)有另一个显示数据的屏幕。我想到的是类似于MS DOS的dir /p
命令。有这样的事吗?
正如@baptiste所建议的那样,this解决方案page(x, method = 'print')
并没有真正解决我的问题。更清楚的是,我想要的是一种不涉及在另一个窗口中打印对象的解决方案,因为这会破坏我的工作流程。如果我不关心这个,我只会使用View()
或类似的东西。
答案 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)
}