r - 将 R 包记录器与 data.frames 结合使用

标签 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

as print() 会给出吗?

最佳答案

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

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

另一种方法是使用 eval 助手:

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

关于r - 将 R 包记录器与 data.frames 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55972067/

相关文章:

scala - 如何为 Spark 数据帧编写多个 WHEN 条件?

r - Sublime Text 显示 R 本地管道 |> 连字与 Fira 代码

r - 省略包含特定 NA 列的行

r - 如何在R中创建 "max"虚拟变量?

登录特定 Controller 的 grails

java - 为 Eclipse 项目设置日志记录配置文件

java - 如何仅从日志文件中删除 Tomcat 信息

r - 子集一个附加变量并将其附加到 R 中的前一个变量

R ggmap 错误 : object 'f' not found

python - 将相对时间更改为 pandas 数据框中的实际日期