2011-10-11 50 views
4

我希望把我的.Rprofile如下:动态调整列大小在.Rprofile

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

这将动态调整在我的R对话的最大列是窗口的宽度。这适用于交互式会话,但做一些如R CMD,当安装或批处理会议上,我总是得到:

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

我怎样才能解决这个问题?我认为问题是Sys.getenv(“COLUMNS”)以某种方式失败?是否有一些if()语句可以让我检测是否批量运行?原始的自动宽度调整代码不是我的,我发现它在其他地方在线。

+0

还有'互动()',测试是否R为与交互或不使用;例如'if(interactive()).adjustWidth < - function(...)'等。 – user109114

回答

7

也许包裹选项在try功能帮助:

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

当然!很简单。很棒。 –

0

对我来说COLUMNS没有得到时,我的X终端窗口(VTE基础,在Linux上)更新,而R的运行被调整,因为它在每个命令之后由bash更新。 (根据this question的接受答案)

我发现了一个暗示,以更好的解决方案this page。它谈到solaris的resize命令,但也提到了stty,这是linux的。

所以阅读手册页(和一些基础研发问题)之后,我想出了这个:

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