Форматером по умолчанию в 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
на других объектах и т. Д.
Другой подход заключается в использовании eval helper:
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