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.