.Rprofile中的动态列大小调整

时间:2011-10-11 11:14:50

标签: r

我想在我的.Rprofile中添加以下内容:

# auto width adjustment
.adjustWidth <- function(...){
   options(width=Sys.getenv("COLUMNS"))
   TRUE
} 
.adjustWidthCallBack <- addTaskCallback(.adjustWidth)

这会动态调整R会话中的最大列,使其成为窗口的宽度。这可以在交互式会话中使用,但在执行R CMD INSTALL或批处理会话时,我总是得到:

Error in options(width = Sys.getenv("COLUMNS")) : 
  invalid 'width' parameter, allowed 10...10000
Execution halted

我该如何解决这个问题?我假设问题是Sys.getenv(“COLUMNS”)以某种方式失败了?是否有一些if()语句可以让我检测我是否批量运行?原来的自动宽度调整代码不是我的,我在其他地方找到了它。

3 个答案:

答案 0 :(得分:7)

也许将选项包装在try函数中会有所帮助:

try( options(width=Sys.getenv("COLUMNS")), silent = TRUE)

答案 1 :(得分:1)

interactive()检查非常重要:否则,它不适用于update.packages()...

> update.packages(lib.loc="...",ask=FALSE,oldPkgs="httpuv")
trying URL 'http://cran.univ-lyon1.fr/src/contrib/httpuv_1.5.1.tar.gz'
...
stty: 'standard input': Inappropriate ioctl for device
Error in options(width = as.integer(howWide)) : 
  invalid 'width' parameter, allowed 10...10000
Calls: updatePrompt -> options
Execution halted
...

答案 2 :(得分:0)

对于我来说COLUMNS在我的X终端窗口(基于vte,在linux上)在R运行时调整大小时不会更新,因为在每个命令之后它会被bash更新。 (根据this question)的接受答案

我在this page找到了更好的解决方案。它讨论了solaris的resize命令,但也提到了stty,linux确实有。

所以在阅读了man-page(以及一些基本的R问题)之后,我想出了这个:

# auto width adjustment
if(interactive()) {
    .adjustWidth <- function(...){
        options('width' = sapply(strsplit(system("stty size", intern = T), " "), "[[", 2))
        TRUE
    }
    .adjustWidthCallBack <- addTaskCallback(.adjustWidth)
}