我正在使用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/