dplyr 屏蔽 GGally 并破坏 ggparcoord

dplyr masks GGally and breaks 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))

结果如下图:

再次开始一个新的会话并使用加载的 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))

结果:

Error: (list) object cannot be coerced to type 'double'

请注意 library(.) 语句的顺序 重要。

问题

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

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

版本

更新

总结 Joran 给出的出色答案:

答案

  1. 代码示例实际上是错误的,因为 ggparcoord(.) 期望 data.frame 而不是 tbl_df 由钻石数据集给出(如果加载了 dplyr)。
  2. 通过将 tbl_df 强制转换为 data.frame.
  3. 解决了这个问题
  4. 不,这不是错误。

工作代码示例:

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

正在将我的评论转化为答案...

这里的 GGally 包做出了合理的假设,即在数据框上使用 [ 应该像往常一样运行。然而,这一切都在 Hadley-verse 中,diamonds 数据集是 tbl_dfdata.frame

当加载 dplyr 时,[ 的行为被覆盖,因此 drop = FALSE 始终是 tbl_df 的默认值。所以在 GGally 中有一个地方 data[,"cut"] 应该是 return 一个向量,但它 return 是另一个数据框。

...具体来说,您的示例在尝试执行时抛出错误:

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

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

至于你的结论,这不是一个错误,我会说......也许。大概。至少 GGally 包作者可能不需要做任何事情来解决它。您只需要注意,将 tbl_df 与非 Hadley 编写的程序包一起使用可能会造成破坏。

如您所述,删除额外的 class 属性可以解决问题,因为 returns R 可以使用正常的 [ 方法。

解决方法:ggparcoord 的数据强制转换为 as.data.table(...)as.data.table(... , keep.rownames=TRUE),除非您想丢失所有行名。

原因: 根据@joran 的调查,当加载 dplyr 时,tbl_df 会覆盖 [,因此 drop = FALSE。

解决方案: 在 GGally 上提交拉取请求。 编辑:已在 v1.3.0 中修复 (https://github.com/ggobi/ggally/commit/bfa930d102289d723de2ce9ec528baf42b3b7b40)