簡體   English   中英

將 R 包記錄器與 data.frames 一起使用

[英]Using R package logger with data.frames

我正在使用記錄器進行記錄。 現在我想記錄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()會給嗎?

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執行此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))'

如果您認為軟件包中缺少一些有用的東西,請在https://github.com/daroczig/logger的 GitHub 存儲庫中打開一張票

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM