Динамическое изменение размера столбца в .Rprofile - PullRequest
4 голосов
/ 11 октября 2011

Я хотел бы добавить следующее в мой .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 ]

7 голосов
/ 11 октября 2011

Может быть полезно добавить параметр в функцию try:

try( options(width=Sys.getenv("COLUMNS")), silent = TRUE)
1 голос
/ 29 мая 2019

Интерактивная проверка () ОЧЕНЬ ВАЖНА: в противном случае она не работает с 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
...
0 голосов
/ 26 октября 2016

Для меня 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...