Динамическое изменение размера столбца в.Rprofile
Я хотел бы добавить следующее в мой.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(), которое я мог бы сделать, чтобы я мог определить, запущен ли я в пакете или нет? Оригинальный код автоматической настройки ширины не мой, я нашел его где-то в Интернете.
2 ответа
Может быть, завернуть вариант в try
функция помогает:
try( options(width=Sys.getenv("COLUMNS")), silent = TRUE)
Для меня COLUMNS
не обновляется, когда мое окно терминала X (на основе vte, на linux) изменяется во время работы R, так как оно обновляется bash после каждой команды. (согласно принятому ответу на этот вопрос)
Я нашел намек на лучшее решение на этой странице. Это говорит о resize
команда для соляриса, но также упоминает stty
, который Linux имеет.
Поэтому после прочтения man-страницы (и некоторых базовых R-вопросов) я пришел к следующему:
# auto width adjustment
if(interactive()) {
.adjustWidth <- function(...){
options('width' = sapply(strsplit(system("stty size", intern = T), " "), "[[", 2))
TRUE
}
.adjustWidthCallBack <- addTaskCallback(.adjustWidth)
}
Интерактивная проверка () ОЧЕНЬ ВАЖНА: в противном случае она не работает с 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
...