将R包记录器与data.frames一起使用

时间:2019-05-03 14:39:22

标签: r dataframe logging

我正在使用logger进行日志记录。现在,我想记录data.frame的内容,目前,结果如下:

> logger::log_formatter(logger::formatter_paste)
> logger::log_info(data.frame(a = 1:3, b = 4:6))
INFO [2019-05-03 14:36:29] 1:3
INFO [2019-05-03 14:36:29] 4:6

这不是我想要的,是否可能得到下面的内容

INFO [2019-05-03 14:36:29]   a b
INFO [2019-05-03 14:36:29] 1 1 4
INFO [2019-05-03 14:36:29] 2 2 5
INFO [2019-05-03 14:36:29] 3 3 6

print()会给出吗?

1 个答案:

答案 0 :(得分:1)

logger中的默认格式化程序为glue(如果未安装sprintf软件包,则为glue),在传递数据帧时会产生错误:

glue::glue(data.frame(a = 1:3, b = 4:6))
#> Error: All unnamed arguments must be length 1

sprintf(data.frame(a = 1:3, b = 4:6))
#> Error in sprintf(data.frame(a = 1:3, b = 4:6)) : 
#>   'fmt' is not a character vector

因此,如果您希望logger处理数据帧,则需要一个自定义格式程序,例如

formatter_data_frame <- function(df, ...) {
    pander::pander_return(df, style = 'simple')
}

library(logger)
log_formatter(formatter_data_frame)
log_info(data.frame(a = 1:3, b = 4:6))
#> INFO [2019-05-04 11:33:47] 
#> INFO [2019-05-04 11:33:47]  a   b 
#> INFO [2019-05-04 11:33:47] --- ---
#> INFO [2019-05-04 11:33:47]  1   4 
#> INFO [2019-05-04 11:33:47]  2   5 
#> INFO [2019-05-04 11:33:47]  3   6 
#> INFO [2019-05-04 11:33:47] 

或者通过在每一行调用paste来实现的目标:

formatter_data_frame <- function(df, ...) {
    apply(df, 1, paste, collapse = ' ')
}

log_formatter(formatter_data_frame)
log_info(data.frame(a = 1:3, b = 4:6))
#> INFO [2019-05-04 11:35:03] 1 4
#> INFO [2019-05-04 11:35:03] 2 5
#> INFO [2019-05-04 11:35:03] 3 6

当然,您可以进行进一步调整,例如对data.frame执行此操作,然后在其他对象上退回到glue

另一种方法是使用评估助手:

df <- data.frame(a = 1:3, b = 4:6)
log_eval(df)
#> TRACE [2019-05-04 11:37:12] 'df' => 'structure(list(a = 1:3, b = 4:6), class = "data.frame", row.names = c(NA,  -3L))'

如果您认为该软件包中缺少某些有用的东西,请在GitHub存储库中的https://github.com/daroczig/logger上打开一张票证