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