2016-01-11 3 views
9

Есть ли общая проблема с печатью data.frame, когда у нее есть столбец списка объектов S4? Или мне просто не повезло?печать data.frame, который содержит столбец списка объектов S4

Я столкнулся с этим с объектами из пакета git2r, но сопровождающий Стефан Видгрен указывает на этот пример от Matrix. Я отмечаю, что объект можно распечатать, если он отправлен через dplyr::tbl_df(). Я согласен с тем, что печать не предоставляет много информации о объектах S4; все прошу не погрешность .

ОБНОВЛЕНО с чуть более высокими амбициями: можно сохранить качество data.frame-like?

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" 

ответ

0

Вот обходной путь, который получает приличный результат печати, за счет перезаписи data.frame (или один может сделать копию для целей печати):

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

Кредит @rawr, который первоначально предложил в комментарии.

+1

Я бы не назвал, что «обходной путь». Это разрушает элементы во втором столбце для совершенно другого класса. Столбцы данных не должны содержать списки. Я подозреваю, что они также должны содержать конструкторы S4. Классические отказоустойчивые усилия включают в себя POSIXlt классифицированные векторы. Я знаю, что они не должны содержать языковые объекты, такие как функции или выражения R. Я думаю, вы должны отказаться от данных в качестве цели и использовать другой контейнерный класс. –

2

Другой вариант (с потенциально большими последствиями, чем хотелось бы) является:

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 
Смежные вопросы