【问题标题】:Printing a timestamp from paste从粘贴打印时间戳
【发布时间】:2020-03-05 03:37:54
【问题描述】:

我想要一个小助手为每个调试语句添加一个时间戳。我不想使用记录器库。这是尝试:

tp = function(...) {
  ts = format(Sys.time(), "%d.%m.%Y %H:%M:%OS")
  m = paste('[',ts,']',str(...))
  print(m)
}

当调用助手 tp 来打印 data.frame 的列时:

 tp(names(df))

预期的输出是这样的:

[ 04.03.2020 19:35:00.345 ]  country state day dt confirmed recovered deaths

但实际输出是:

 chr [1:7] "country" "state" "day" "dt" "confirmed" "recovered" "deaths"
[1] "[ 04.03.2020 19:35:00.345 ] "

注意我添加了

 str(...)

因为否则输出是每列元素一行。相反,输出应该保持打印在一行上:也许通过某种方式加入集合项目?我可以使用一些帮助来清理它。

【问题讨论】:

  • 有r标签,最后我检查它在r解释器中运行;)
  • 啊我错了df.names修复

标签: r


【解决方案1】:

您需要将省略号参数粘贴到一个字符串中。

tp = function(...) {
  ts = format(Sys.time(), "%d.%m.%Y %H:%M:%OS")
  m = paste('[', ts, ']', paste(..., collapse = " "))
  print(m)
}

df <- data.frame("country" = NA,
                 "state" = NA,
                 "day" = NA)

tp(names(df))
#> [1] "[ 05.03.2020 08:10:58 ] country state day"

【讨论】:

  • 啊呀——经常看到人们定义paste0 = function (...) paste(...,collapse='')。在这种情况下,我可能会崩溃 ,
  • 是否可以省略输出周围的双括号 - 现在在 REPL 中运行时看起来像 [1] "[ 04.03.2020 20:08:11.736 ] country state day dt confirmed recovered deaths"
  • 在这种情况下,您需要cat,正如迈克尔在下面回答的那样。
  • 我在这里保留了赞成票,但按照您的建议接受了迈克尔的投票
  • 是的,这是一个更好的答案哈!
【解决方案2】:

您可能实际上想要cat,而不是print。

然后你可以定义:

tp = function(...) {
  cat(format(Sys.time(), "[ %d.%m.%Y %H:%M:%OS ]"), ...)
  return(invisible())
}

tp(names(df))
# [ 05.03.2020 12:03:13.015595 ] country state day

注意缺少[1] "..."

FWIW R 内置了date(),格式不同但更简洁:

cat(date())
# Thu Mar  5 04:04:37 2020

或者,如果您不需要亚秒级精度并且可以使用 ISO 格式,format = '[ %F %T ]' 也更简洁。

您也可以考虑使用%z 和/或format.POSIXct 的tz 参数在您的日志中传达系统时区。

【讨论】:

  • thx 我刚刚询问过要删除多余的宣传;照顾它
  • 你试过了吗?我在结尾看到NULL 4.03.2020 20:13:05.224] country state day dt confirmed recovered deathsNULL
  • @javadba 您可以查看stackoverflow.com/q/31843662/3576984 或stackoverflow.com/q/12775085/3576984 以获取有关cat 与print 的更多详细信息。总之,cat 是记录日志的理想选择(直通stdout),print 更多的是用于理解/显示 R 中的结构。
  • re NULL 我的错我没有用 return 替换 print。如您所见。
  • 是的——cat 的返回值是NULL(invisible() 同上)——参见x=cat(1, 2, 3); print(x)。您可能还想添加cat('\n') 来强制回车,或者在... 之后放置'\n'。
猜你喜欢
  • 2012-04-09
  • 2018-03-27
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多