2016-01-11 7 views
9

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" 

risposta

0

Ecco una soluzione che ottiene un risultato della stampa decente, a costo di sovrascrivere il data.frame (o si potrebbe fare una copia per la stampa):

library(Matrix) 
m <- new("dgCMatrix") 
df <- data.frame(id = 1:2) 
df$matrices <- list(m, m) 
df[] <- lapply(df, as.character) 
df 
#> id       matrices 
#> 1 1 <S4 object of class "dgCMatrix"> 
#> 2 2 <S4 object of class "dgCMatrix"> 

credito a @rawr, chi originariamente suggeriva in un commento.

+1

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. –

2

Un'altra opzione (con potenzialmente maggiori conseguenze di voluta):

library(Matrix) 

format.list <- function(x, ...) { rep(class(x[[1]]), length(x)) } 

m <- new("dgCMatrix") 
df <- data.frame(id = 1:2) 
df$matrices <- list(m, m) 
df 

## id matrices 
## 1 1 dgCMatrix 
## 2 2 dgCMatrix 
Problemi correlati