在 R 命令行中显示时间时钟

48

我想知道是否有一种方法可以在R命令行中显示当前时间,就像在MS DOS中我们可以使用

Prompt $T $P$G

将时间时钟包含在每个提示行中。类似这样:

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

我会翻译它,但是那样它就被固定在设置的时间了。我不确定如何使其自动更新。


当前基于回调的答案都不能像MS DOS提示符一样做到同样的事情,因为它们依赖于顶层命令的执行。如果在控制台中只是简单地按下CR/LF,它不会更新时间,而在MS DOS中会更新。 - Iterator
在我坐的地方,我可以看到屏幕时钟、手表、我可靠的老Palm VX和手机上的时间。你真的需要另一个提醒你逝去的生命吗? :) 它真的只是为了给你的活动打时间戳吗? - Spacedman
2
@Spacedman 是的,那就是我会做的。有时候我会从控制台运行一个命令,并希望知道它何时结束,如果我离开了。其他方法也可以很好地做到这一点,但我仍然需要检查时钟时间(或执行新命令)。我有很多分析、日志记录、消息传递等等,所以这个提示可能是多余的,但无妨。无论如何,我认为最好解决提出的问题。 - Iterator
5个回答

52

使用 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>
我们注册一个回调函数,在每次命令完成后对其进行评估。这就是诀窍所在。此文档包含了更高级的文档,来自R开发者网站。

糟糕,刚刚修复了Duncan TL的写作URL。 - Dirk Eddelbuettel
@Dirk:太棒了,感谢您指出那个函数。然而,这个解决方案仍然存在一个小错误:当您遇到错误时,它不会更新时间。尝试运行f <- function() { Sys.sleep(1) ; stop() } - 然后 - f()。虽然我不知道如何解决这个问题... - Joris Meys
@Shu:如果你使用Dirks的解决方案,然后尝试我给出的那个函数,你会发现时间没有更新。当命令发生错误时,回调函数不会被评估。但这只是一个非常微小的不便,我只是喜欢为了吹毛求疵而提一下;-) - Joris Meys
1
@Shu:如果你需要在命令输入和错误报告之间的时间,请使用system.time()。它会告诉你时间停止的确切时间。 - Joris Meys
在我的 Mac(运行 2.14)的 GUI 中无法正常工作,但当 R 作为终端应用程序启动时可以工作。有任何想法原因是什么? - Dason
显示剩余6条评论

19

其他基于回调的方法都不会更新提示,除非执行顶级命令。 因此,在控制台中按回车键不会创建更改。 这就是R标准回调处理的性质。

如果安装了tcltk2包,则可以设置一个任务计划程序,将option()更改如下:

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

嘿,这就像 MS DOS 提示符一样。

NB:灵感来自于这个答案


注意1:等待时间(在此情况下为1000)是指毫秒数,而不是秒数。当亚秒分辨率有用时,可以将其向下调整。

18

以下是另一种回调解决方案:

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

这和 Dirk 的方法一样,但语法对我来说更简单。


1
不幸的是,这两种方法都不像DOS提示符那样精确,即使按下回车键也会更新。回调只等待顶级执行。为了学习如何通过时钟触发器完成它,我创建了一个使用tcltk2包的解决方案。 - Iterator

3
你可以通过使用options()命令更改默认显示的字符。你可以尝试像这样的操作:
options(prompt = paste(Sys.time(), ">"))

查看帮助页面?options,可以获得完整的设置列表。这是非常有用的知识!

如果您想为每个R会话执行此操作,请考虑将其移动到.Rprofile中。在这个主题上,还可以找到其他好的编程技巧。


2
实际上并不完全是这样。您只能获得设置 options("prompt"=...)常量时间表达式。您需要一个回调函数,就像我在我的答案中所示。 - Dirk Eddelbuettel
3
这是OP提供但并不喜欢的解决方案。但是对Rprofile的引用很有用。 - Joris Meys

0

我不知道是否有原生的R函数可以做到这一点,但我知道R与其他有系统时间命令的语言接口。也许这是一个选择?

Thierry提到了system.time(),还有proc.time(),具体取决于您需要它做什么,尽管这两个命令都不能给出当前时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接