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(.) 语句的顺序 不 重要。
问题
- 代码示例有问题吗?
- 有没有办法解决这个问题(通过一些命名空间函数)?
- 或者这是一个错误?
我需要 dplyr 和 ggparcoord(.) 进行更大的分析,但这个最小的例子反映了我面临的问题。
版本
- R @ 3.2.3
- dplyr @ 0.4.3
- GGally @ 1.0.1
- ggplot @ 2.0.0
更新
总结 Joran 给出的出色答案:
答案
- 代码示例实际上是错误的,因为 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))
正在将我的评论转化为答案...
这里的 GGally 包做出了合理的假设,即在数据框上使用 [
应该像往常一样运行。然而,这一切都在 Hadley-verse 中,diamonds
数据集是 tbl_df
和 data.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)
给了一个新的会话, 执行函数文档中提供的 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(.) 语句的顺序 不 重要。
问题
- 代码示例有问题吗?
- 有没有办法解决这个问题(通过一些命名空间函数)?
- 或者这是一个错误?
我需要 dplyr 和 ggparcoord(.) 进行更大的分析,但这个最小的例子反映了我面临的问题。
版本
- R @ 3.2.3
- dplyr @ 0.4.3
- GGally @ 1.0.1
- ggplot @ 2.0.0
更新
总结 Joran 给出的出色答案:
答案
- 代码示例实际上是错误的,因为 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))
正在将我的评论转化为答案...
这里的 GGally 包做出了合理的假设,即在数据框上使用 [
应该像往常一样运行。然而,这一切都在 Hadley-verse 中,diamonds
数据集是 tbl_df
和 data.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)