C'è un problema generale con la stampa di data.frame
quando ha una lista-colonna di oggetti S4? O sono solo sfortunato?stampa un data.frame che contiene una lista-colonna di oggetti S4
Mi sono imbattuto in questo con oggetti dal pacchetto git2r
ma il gestore Stefan Widgren indica questo esempio da Matrix
pure. Prendo atto che l'oggetto può essere stampato se inviato attraverso dplyr::tbl_df()
. Accetto che la stampa non fornisca molte informazioni sugli oggetti S4;
tutto quello che chiedo non è un errore
.
AGGIORNATO con ambizione leggermente superiore: è possibile conservare la qualità pari a data.frame
?
library(Matrix)
library(dplyr)
m <- new("dgCMatrix")
isS4(m)
#> [1] TRUE
df <- data.frame(id = 1:2)
df$matrices <- list(m, m)
df
#> Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, : first argument must be atomic
tbl_df(df)
#> Source: local data frame [2 x 2]
#>
#> id
#> (int)
#> 1 1
#> 2 2
#> Variables not shown: matrices (list).
## force dplyr to show the tricky column
tbl_df(select(df, matrices))
#> Source: local data frame [2 x 1]
#>
#> matrices
#> (list)
#> 1 <S4:dgCMatrix, CsparseMatrix, dsparseMatrix, generalMatrix, dCsparseMatrix,
#> 2 <S4:dgCMatrix, CsparseMatrix, dsparseMatrix, generalMatrix, dCsparseMatrix,
## rawr points out that this does not error ... but loses the df quality
print.default(df)
#> $id
#> [1] 1 2
#>
#> $matrices
#> $matrices[[1]]
#> 0 x 0 sparse Matrix of class "dgCMatrix"
#> <0 x 0 matrix>
#>
#> $matrices[[2]]
#> 0 x 0 sparse Matrix of class "dgCMatrix"
#> <0 x 0 matrix>
#>
#>
#> attr(,"class")
#> [1] "data.frame"
Non direi che una "soluzione". Ciò costringe in modo distruttivo gli oggetti della seconda colonna a una classe completamente diversa. Le colonne dei dataframes non dovrebbero contenere liste. Sospetto che siano anche i nos che dovrebbero contenere costruttori S4. Gli sforzi classici incline al fallimento implicano i vettori classificati POSIXlt. So che non dovrebbero contenere oggetti linguaggio come funzioni o espressioni R. Penso che dovresti abbandonare i dataframes come target e utilizzare una classe contenitore diversa. –