2016-01-11 8 views
9

Gibt es ein generelles Problem beim Drucken eines data.frame, wenn es eine Liste mit S4-Objekten enthält? Oder habe ich nur Pech?Drucken eines data.frames, das eine Listenspalte von S4-Objekten enthält

Ich lief über diese mit Objekten aus dem git2r Paket, aber Maintainer Stefan Widgren zeigt dieses Beispiel von Matrix auch. Ich beachte, dass das Objekt gedruckt werden kann, wenn es durch dplyr::tbl_df() gesendet wird. Ich akzeptiere, dass das Drucken nicht viele Informationen über S4-Objekte liefert; alles, was ich frage, ist kein Fehler .

AKTUALISIERT mit etwas höheren Ambition: kann die data.frame -ähnliche Qualität erhalten bleiben?

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" 

Antwort

0

Hier eine Abhilfe, die die data.frame überschreiben ein ordentliches Druckergebnis auf Kosten bekommt (oder man könnte eine Kopie für den Druck machen):

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"> 

Credit @rawr, wer hat ursprünglich in einem Kommentar vorgeschlagen.

+1

ich, dass eine "Abhilfe" nicht nennen. Dadurch werden die Elemente in der zweiten Spalte destruktiv in eine völlig andere Klasse umgewandelt. Die Spalten von Datenrahmen dürfen keine Listen enthalten. Ich vermute, dass sie auch keine S4-Konstruktoren enthalten sollen. Die klassischen fehleranfälligen Versuche betreffen POSIX-klassifizierte Vektoren. Ich weiß, dass sie keine Sprachobjekte wie Funktionen oder R-Ausdrücke enthalten sollen. Ich denke, Sie sollten Datenframes als Ziel aufgeben und eine andere Container-Klasse verwenden. –

2

Eine weitere Option (mit potenziell größeren Folgen als erwünscht) ist:

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