Отображение часов в командной строке R

Интересно, есть ли способ отобразить текущее время в командной строке R, как в MS DOS, мы можем использовать

Prompt $T $P$G

чтобы включить часы в каждую строку подсказки. Что-то типа

options(prompt=paste(format(Sys.time(), "%H:%M:%S"),"> "))

будет делать это, но тогда это будет исправлено во время установки. Не знаю, как сделать так, чтобы оно обновлялось автоматически.


person Shu    schedule 19.11.2010    source источник
comment
Ни один из текущих ответов на основе обратных вызовов не выполняет того же действия, что и приглашение MS DOS, потому что они зависят от выполнения команды верхнего уровня. Если просто нажать CR / LF в консоли, время не обновится, а оно будет обновлено в MS DOS.   -  person Iterator    schedule 08.02.2012
comment
Там, где я сижу, я вижу время на своих экранных часах, на моих наручных часах, моем верном старом Palm VX и моем телефоне. Вам действительно нужно еще одно напоминание о растущей смертности? :) Неужели это просто для отметки времени вашей активности?   -  person Spacedman    schedule 08.02.2012
comment
@Spacedman Да, я бы так и поступил. Иногда я запускаю команду с консоли и хочу знать, когда она закончилась, отошел ли я. Другие методы делают это достаточно хорошо, но тогда мне все равно нужно проверить время (или выполнить новую команду). У меня много профилей, журналов, обмена сообщениями и т. Д., Так что эта подсказка может быть излишней, но какого черта. :) В любом случае я посчитал, что лучше всего решить заданный вопрос.   -  person Iterator    schedule 08.02.2012


Ответы (5)


Чейз указывает верный путь, поскольку для этого можно использовать options("prompt"=...). Но его решения добавляют выражение времени constant, чего мы не хотим.

В документации к функции taskCallbackManager все остальное:

R> h <- taskCallbackManager()
R> h$add(function(expr, value, ok, visible) { 
+     options("prompt"=format(Sys.time(), "%H:%M:%S> ")); 
+             return(TRUE) }, 
+     name = "simpleHandler")
[1] "simpleHandler"
07:25:42> a <- 2
07:25:48>

Мы регистрируем обратный вызов, который оценивается после завершения каждой команды. Это трюк. Более интересная документация находится в этом документе с сайта разработчиков R.

person Dirk Eddelbuettel    schedule 19.11.2010
comment
Упс, только что исправил URL-адрес описания Дункана Т.Л. - person Dirk Eddelbuettel; 19.11.2010
comment
@Dirk: Замечательно, спасибо за указатель на эту функцию. Тем не менее, в этом решении все еще есть небольшая ошибка: когда у вас есть ошибка, время не обновляется. Попробуйте f ‹- function () {Sys.sleep (1); stop ()} - а затем - f (). Не то чтобы я знал, как это сделать ... - person Joris Meys; 19.11.2010
comment
Спасибо Дирку и Джорису! @Joris: не могли бы вы подробнее рассказать об обновлении времени при возникновении ошибки. Я пробовал function () {Sys.sleep (1); stop ()}, но похоже, что это не сработало. - person Shu; 23.11.2010
comment
@Shu: если вы используете решение Dirks, а потом попробуете ту функцию, которую я дал, вы увидите, что время не обновляется. Обратный вызов не оценивается, когда команда выдает ошибку. Но это очень крошечное незначительное неудобство, о котором я хотел упомянуть просто ради прически ;-) - person Joris Meys; 23.11.2010
comment
Спасибо, Джорис, решение Dirks очень полезно, просто я немного жадный к большему, так как кто-то хотел бы, чтобы я предоставил информацию о времени ошибки, сообщаемой в консоли R. Интересно, возможно ли это. - person Shu; 24.11.2010
comment
@Shu: Если вам нужно время между подачей команды и сообщением об ошибке, используйте system.time (). Он сообщает вам, когда именно остановился отсчет времени. - person Joris Meys; 24.11.2010
comment
Это не работает на моем Mac (работающем под управлением 2.14) в графическом интерфейсе, но работает, когда R запускается как терминальное приложение. Есть идеи, почему? - person Dason; 13.12.2011
comment
Графические интерфейсы пользователя мешают циклам событий и, следовательно, портят схему обратного вызова. - person Dirk Eddelbuettel; 13.12.2011
comment
К сожалению, обратный вызов, который зависит от выполнения верхнего уровня, не будет обновляться с помощью CR / LF, в отличие от приглашения DOS. Вот где у tcltk2 есть кое-что интересное. - person Iterator; 08.02.2012
comment
Как я могу добавить это к чему-то вроде моего .Rprofile, чтобы он загружался каждый раз в каждом проекте? - person Adam_G; 20.03.2019
comment
Мне пришлось назначить обработчик (и вызываемую им вспомогательную функцию) для .GlobalEnv в .Rprofile - возможно, потому, что я сделал все это в блоке if (interactive ()) {}. - person Jack Wasey; 19.04.2019

Ни один из других методов, основанных на обратных вызовах, не обновит приглашение , если не будет выполнена команда верхнего уровня. Таким образом, нажатие клавиши возврата в консоли не приведет к изменению. Такова природа стандартной обработки обратного вызова R.

Если вы устанавливаете пакет tcltk2, вы можете настроить планировщик задач, который изменяет option() следующим образом:

library(tcltk2)
tclTaskSchedule(1000, {options(prompt=paste(Sys.time(),"> "))}, id = "ticktock", redo = TRUE)

Вуаля, что-то вроде подсказки MS DOS.

NB: вдохновение пришло из этого ответа.


Примечание 1. Время ожидания (в данном случае 1000) относится к количеству миллисекунд, а не секунд. Вы можете отрегулировать его в сторону понижения, если разрешение менее чем за секунду будет чем-то полезным.

person Iterator    schedule 08.02.2012

Вот альтернативное решение обратного вызова:

updatePrompt <- function(...) {options(prompt=paste(Sys.time(),"> ")); return(TRUE)}
addTaskCallback(updatePrompt)

Это работает так же, как метод Дирка, но синтаксис для меня немного проще.

person John Colby    schedule 12.12.2011
comment
К сожалению, ни то, ни другое не похоже на приглашение DOS, которое будет обновляться даже при нажатии клавиши возврата. Обратные вызовы ждут только выполнения верхнего уровня. Чтобы узнать, как это сделать с помощью часового триггера, я создал решение с пакетом tcltk2. - person Iterator; 08.02.2012

Вы можете изменить отображаемый по умолчанию символ с помощью команды options(). Вы можете попробовать что-то вроде этого:

options(prompt = paste(Sys.time(), ">"))

Посетите страницу справки для ?options, чтобы получить полный список настроек. Это очень полезная вещь!

Предполагая, что это то, что вы хотите делать для каждого сеанса R, подумайте о переносе этого в свой .Rprofile. Несколько других хороших примеров счастья в программировании можно найти здесь по этой теме. .

person Chase    schedule 19.11.2010
comment
На самом деле не совсем так. Вы получаете постоянное выражение времени, когда было установлено options("prompt"=...). Вам нужен обратный звонок, как показано в моем ответе. - person Dirk Eddelbuettel; 19.11.2010
comment
Это решение, которое OP дал и не понравилось. Но ссылка на Rprofile пригодится. - person Joris Meys; 19.11.2010

Я не знаю встроенной функции R для этого, но я знаю, что у R есть интерфейсы с другими языками, в которых есть команды системного времени. Может это вариант?

Тьерри упомянул system.time(), и есть также proc.time() в зависимости от того, для чего вам это нужно, хотя ни один из них не дает вам текущего времени.

person Daniel Standage    schedule 19.11.2010