dplyr屏蔽了GGally并破坏了ggparcoord。

9

给定一个新的会话,在函数文档中提供的小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))

结果呈现在以下图表中:

enter image description here

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

结果为:

错误: (list)对象无法强制转换为'type' double'

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

问题

  1. 代码示例有问题吗?
  2. 是否有办法通过一些命名空间函数来克服这个问题?
  3. 还是说这是一个 bug?

我需要在更大的分析中使用 dplyrggparcoord(.),但这个最小化的示例反映了我所面临的问题。

版本

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

更新

为了总结 Joran 给出的优秀答案:

回答

  1. 代码示例实际上是错误的,因为 ggparcoord(.) 需要一个 data.frame,而不是钻石数据集(如果加载了 dplyr 则为 tbl_df)。
  2. tbl_df 强制转换为 data.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))

我所有的东西都一样,但是GGally @ 1.0.0,而且两个代码都有相同的错误。 - HubertL
7
这里的 GGally 包做出合理的假设,即对数据框使用 [ 应该始终表现出它一直以来的行为方式。然而,由于这些都属于 Hadley-verse,diamonds 数据集既是 tbl_df 也是 data.frame。当加载了 dplyr 后,[ 的行为会被覆盖,使得对于 tbl_dfdrop = FALSE 总是默认值。因此,在 GGally 中有一个地方期望 data[,"cut"] 返回一个向量,但实际上它返回另一个数据框。 - joran
3
在你的例子中,当执行 data[, fact.var] <- as.numeric(data[, fact.var]) 时,会抛出错误。因为 data[,fact.var] 仍然是一个数据框架,因此也是一个列表,as.numeric 无法正常工作。 - joran
谢谢您的快速和好的回答! - Hannes
1
@joran 向 GGally 提交一个拉取请求。 :) - Roman Luštrik
显示剩余5条评论
2个回答

16
将我的评论转换为答案...
这里的GGally包做出了一个合理的假设,即在数据框上使用[应该表现出它一直以来的行为方式。然而,在Hadley-verse中,diamonds数据集除了是data.frame之外还是tbl_df。
当加载dplyr时,[的行为被覆盖,以至于drop = FALSE总是默认为tbl_df的情况。因此,在GGally中有一个地方期望data[,"cut"]返回一个向量,但实际上它返回另一个数据框。
...具体而言,在您的示例中执行以下操作时会引发错误:
data[, fact.var] <- as.numeric(data[, fact.var]). 

由于data[,fact.var]仍然是一个数据框,因此也是一个列表,as.numeric将无法工作。

至于您得出的这不是错误的结论,我会说......也许吧。可能是这样的。至少GGally软件包作者不需要做任何事情来解决它。您只需注意使用非Hadley编写的软件包时使用tbl_df可能会出现问题。

正如您所指出的,删除多余的类属性可以解决该问题,因为它会将R返回到使用常规[方法的状态。


7
对于那些想知道的人,这种情况在 data.table 中不会发生。虽然 data.table 也覆盖了 [,但它有一种机制可以自动与期望 data.frame 的包兼容,这里有描述 [链接]。 - Matt Dowle

1
解决方法: 强制将您的数据转换为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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接