在 R 命令行中显示时钟

Posted

技术标签:

【中文标题】在 R 命令行中显示时钟【英文标题】:Display a time clock in the R command line 【发布时间】:2011-05-12 11:17:15 【问题描述】:

不知道有没有办法在R命令行中显示当前时间,就像在MS DOS中一样,我们可以使用

Prompt $T $P$G

在每个提示行中包含时钟。 类似的东西

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

会这样做,但它会在设置时固定。我不知道如何让它自动更新。

【问题讨论】:

当前基于回调的答案中没有一个与 MS DOS 提示符做同样的事情,因为它们依赖于***命令的执行。如果只是在控制台中按 CR/LF,它不会更新时间,而在 MS DOS 中会更新。 我坐的地方可以看到屏幕时钟、手表、值得信赖的旧 Palm VX 和手机上的时间。你真的需要再次提醒你不断增加的死亡率吗? :) 真的只是为您的活动添加时间戳吗? @Spacedman 是的,我就是这么做的。有时我从控制台运行命令,想知道它什么时候结束,如果我离开了。其他方法做得相当好,但我仍然需要检查时钟时间(或执行新命令)。我有很多分析、日志记录、消息传递等,所以这个提示可能是多余的,但到底是什么。 :) 无论如何,我认为最好解决所提出的问题。 【参考方案1】:

基于回调的其他方法都不会更新提示除非执行了***命令。因此,在控制台中按回车键不会产生变化。这就是 R 标准回调处理的本质。

如果您安装了tcltk2 包,您可以设置一个任务调度程序来更改option(),如下所示:

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

瞧,类似于 MS DOS 提示符。

注意:灵感来自this answer。


注意 1:等待时间(本例中为 1000)指的是毫秒数,而不是秒数。当亚秒级分辨率有用时,您可能会向下调整它。

【讨论】:

【参考方案2】:

我不知道用于执行此操作的本机 R 函数,但我知道 R 具有与其他具有系统时间命令的语言的接口。也许这是一个选择?

Thierry 提到了system.time(),还有proc.time(),这取决于您的需要,尽管这些都没有给您当前时间。

【讨论】:

【参考方案3】:

这里是另一种回调解决方案:

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

这与 Dirk 的方法相同,但语法对我来说更简单。

【讨论】:

不幸的是,两者都不完全像 DOS 提示符,即使按下回车键也会更新。回调只等待***执行。为了了解如何通过时钟触发器来实现,我使用 tcltk2 包创建了一个解决方案。【参考方案4】:

Chase 指出了正确的方法,因为 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 开发者网站的 in this document。

【讨论】:

糟糕,刚刚修复了 Duncan TL 文章的 URL。 @Dirk :太好了,感谢指向该函数的指针。然而,这个解决方案仍然有一个小错误:当你有错误时,它不会更新时间。试试 f 感谢德克和乔里斯! @Joris:您能否进一步详细说明更新出现错误的时间。我试过 function() Sys.sleep(1) ; stop() ,但它似乎没有工作。 @Shu :如果您使用 Dirks 解决方案,然后尝试我提供的功能,您会看到时间没有更新。当命令发出错误时,不会评估回调。但这是一个非常微小的不便,我只是想为了头发分裂而提到;-) @Shu : 如果需要命令给出到报错之间的时间,使用system.time()。它会告诉你时间的确切停止时间。【参考方案5】:

您可以通过options() 命令更改显示的默认字符。你可能想尝试这样的事情:

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

查看?options 的帮助页面,了解您可以设置的完整列表。这是一件非常有用的事情!

假设这是您希望为每个 R 会话执行的操作,请考虑将其移至您的 .Rprofile。可以在 hither 上找到有关该主题的其他几个编程乐趣。

【讨论】:

其实不完全是。您将获得设置 options("prompt"=...) 时的 constant 时间表达式。你需要一个回调,如我的回答所示。 这是 OP 给出但不喜欢的解决方案。但是对 Rprofile 的引用很有用。

以上是关于在 R 命令行中显示时钟的主要内容,如果未能解决你的问题,请参考以下文章

在windows命令行中如何运行c程序的文本

如何从 unix 命令行中提取 R major.minor 版本?

WINDOWS 2000 SEVER 命令行中都有哪些命令

cmd命令行中logcat输出日志中文乱码

elinks-命令行中的浏览器

*忽略* C++和C#如何在命令行中显示百分比[重复]