Использование регистратора пакетов R с data.frames - PullRequest
1 голос
/ 03 мая 2019

Я использую 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 Ответ

1 голос
/ 04 мая 2019

Форматером по умолчанию в 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

...