Динамическое изменение размера столбца в.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
...
Другие вопросы по тегам