我想在我的.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()语句可以让我检测我是否批量运行?原来的自动宽度调整代码不是我的,我在其他地方找到了它。
答案 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)
}