dplyr掩盖GGally并打破ggparcoord

Han*_*nes 9 r ggplot2 dplyr parallel-coordinates ggally

给定一个新的会话,执行函数文档中提供的小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))
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述

再次,从一个新的会话开始并使用加载的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))
Run Code Online (Sandbox Code Playgroud)

结果是:

错误:(列表)对象无法强制输入'double'

需要注意的是顺序库()语句也没有关系.

问题

  1. 代码示例有问题吗?
  2. 有没有办法克服这个问题(通过一些命名空间函数)?
  3. 或者这是一个错误?

我需要更大的分析中的dplyrggparcoord(.),但这个最小的例子反映了我面临的问题.

版本

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

UPDATE

将Joran给出的优秀答案包括起来:

答案

  1. 代码示例实际上是错误的,因为ggparcoord(.)期望data.frame不是钻石数据集给出的tbl_df(如果加载了dplyr).
  2. 问题是由强迫的解决tbl_dfdata.frame.
  3. 不,这不是一个bug.

工作代码示例:

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))
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 16

将我的评论转换为答案......

这里的GGally包是合理的假设,即[在数据框上使用应该按照它始终如一的方式运行.然而,这一切都在Hadley-verse中,diamonds数据集既是一个tbl_df也是一个data.frame.

dplyr被加载,行为[被覆盖,使得drop = FALSE始终是一个默认的tbl_df.因此,在GGally中有一个地方data[,"cut"]可以返回一个向量,但它会返回另一个数据帧.

...具体而言,在尝试执行时,您的示例中会抛出错误:

data[, fact.var] <- as.numeric(data[, fact.var]). 
Run Code Online (Sandbox Code Playgroud)

由于data[,fact.var]仍然是数据框,因此列表as.numeric不起作用.

至于你的结论,这不是一个错误,我会说....也许.大概.至少可能没有GGally包作者应该做的任何事情来解决它.你必须要知道,使用tbl_df非Hadley编写的软件包可能会破坏事情.

如您所述,删除额外的类属性可以解决问题,因为它使用普通[方法返回R.

  • 对于那些想知道的人来说,`data.table`不会发生这种情况.虽然`data.table`也会覆盖```它有一种与期望`data.frame`的包自动兼容的机制,[在这里描述](http://stackoverflow.com/a/10529888/403310). (7认同)