Dplyr маскирует GGally и разрывает ggparcoord

Учитывая свежий сеанс, выполняя небольшой пример ggparcoord (.), представленный в документации по функции

library(GGally)

data(diamonds, package="ggplot2")
diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
ggparcoord(data = diamonds.samp, columns = c(1, 5:10))

приводит к следующему графику:

введите описание изображения здесь

Снова, начиная с нового сеанса и выполняя тот же script с загруженным dplyr

library(GGally)
library(dplyr)

data(diamonds, package="ggplot2")
diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
ggparcoord(data = diamonds.samp, columns = c(1, 5:10))

приводит к:

Ошибка: (список) объект не может быть принудительно напечатан 'double'

Обратите внимание, что порядок библиотек (.) операторов имеет не.

Вопросы

  • Что-то не так с образцами кода?
  • Есть ли способ преодолеть проблему (над некоторыми функциями пространства имен)?
  • Или это ошибка?

Мне нужен как dplyr, так и ggparcoord (.) в более крупном анализе, но этот минимальный пример отражает проблему, с которой я сталкиваюсь.

Версия

  • R @3.2.3
  • dplyr @0.4.3
  • GGally @1.0.1
  • ggplot @2.0.0

UPDATE

Чтобы обернуть отличный ответ, заданный Джораном:

Ответы

  • Образцы кода на самом деле ошибочны, поскольку ggparcoord (.) ожидает, что data.frame не будет tbl_df, заданный набором данных алмазов (если dplyr загружен).
  • Проблема решается путем принуждения tbl_df к файлу data.frame.
  • Нет, это не ошибка.

Пример рабочего кода:

library(GGally)
library(dplyr)

data(diamonds, package="ggplot2")
diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
ggparcoord(data = as.data.frame(diamonds.samp), columns = c(1, 5:10))

Ответ 1

Преобразование моих комментариев в ответ...

В пакете GGally делается разумное предположение, что использование [ в кадре данных должно вести себя так, как всегда, всегда и всегда. Тем не менее, все это в стихе Хэдли, набор данных diamonds равен tbl_df, а также data.frame.

Когда загружается dplyr, поведение [ переопределяется, так что drop = FALSE всегда является значением по умолчанию для tbl_df. Итак, место в GGally, где data[,"cut"], как ожидается, вернет вектор, но вместо этого возвращает другой фрейм данных.

... в частности, ошибка возникает в вашем примере при попытке выполнить:

data[, fact.var] <- as.numeric(data[, fact.var]). 

Так как data[,fact.var] остается фреймом данных, и, следовательно, список as.numeric не будет работать.

Что касается вашего вывода, что это не ошибка, я бы сказал... может быть. Вероятно. По крайней мере, вероятно, нет ничего, что должен был сделать автор пакета GGally, чтобы его решить. Вы просто должны знать, что использование tbl_df с не-Хэдли письменными пакетами может нарушить работу.

Как вы отметили, удаление дополнительных атрибутов класса устраняет проблему, поскольку возвращает R в обычный метод [.

Ответ 2

Обходной путь:. Закажите свои данные за ggparcoord до as.data.table(...) или as.data.table(... , keep.rownames=TRUE), если вы не хотите потерять все свои имена.

Причина: в соответствии с заданием @joran, когда загружается dplyr, tbl_df переопределяет [, так что drop = FALSE.

Решение: введите запрос на загрузку GGally.