2010-11-19 2 views
39

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

Prompt $T $P$G 

включить таймер в каждой строке подсказки. Что-то вроде

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

будет делать это, но тогда она фиксируется в то время он был установлен. Я не уверен, как сделать это обновление автоматически.

+0

Ни один из текущих ответов на основе обратного вызова не делает то же самое, что и приглашение MS DOS, поскольку они зависят от выполнения команды верхнего уровня. Если вы просто нажмете CR/LF в консоли, он не обновит время, в то время как это будет обновлено в MS DOS. – Iterator

+0

Где я сижу, я вижу время на экране, часы, мой верный старый Palm VX и мой телефон. Вам действительно нужно другое напоминание о вашей растущей смертности? :) Это действительно только для временного отслеживания вашей деятельности? – Spacedman

+1

@Spacedman Да, вот что я сделал бы. Иногда я запускаю команду с консоли и хочу знать, когда она закончится, если я уйду. Другие методы делают это достаточно хорошо, но тогда мне еще нужно проверить время (или выполнить новую команду). У меня много профилирования, регистрации, обмена сообщениями и т. Д., Поэтому эта подсказка может быть лишней, но что это за черт. :) В любом случае, я решил, что лучше всего решить вопрос, который был задан. – Iterator

ответ

0

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

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

3

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

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

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

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

+2

Собственно, не совсем. Вы получаете выражение * constant * time, когда было установлено значение «options (« prompt »= ...)». Вам нужен обратный вызов, как показано в моем ответе. –

+2

Это решение OP дало и не понравилось. Но ссылка на Rprofile полезна. –

45

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

документация для функции 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> 

мы регистрируем функцию обратного вызова, которая получает оценку после каждого завершения команды. Это делает трюк. Более причудливая документация - in this document с сайта разработчика R.

+0

Ooops, просто установил URL-адрес для записи Duncan TL. –

+0

@Dirk: Замечательно, thx для указателя на эту функцию. Тем не менее, в этом решении по-прежнему есть -minor-bug: когда у вас есть ошибка, он не обновляет время. Попробуйте f <- function() {Sys.sleep (1); stop()} - и затем - f(). Не то, чтобы я знал, как это сделать, хотя ... –

+0

Спасибо Дирк и Джорис! @Joris: не могли бы вы немного подробнее уточнить время, когда произошла ошибка. Я попробовал функцию() {Sys.sleep (1); stop()}, но, похоже, это не сработало. – Shu

17

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

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

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

+1

К сожалению, ни одна из них не похожа на подсказку DOS, которая будет обновляться даже при нажатии клавиши возврата. Обратные вызовы ждут только выполнения верхнего уровня. Чтобы узнать, как это сделать с помощью триггера часов, я создал решение с пакетом 'tcltk2'. – Iterator

14

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

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

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

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

NB: Вдохновение пришло с this answer.


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

Смежные вопросы