给定一个新的会话,在函数文档中提供的小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))
结果为:
错误: (list)对象无法强制转换为'type' double'
请注意,library(.)语句的顺序并不重要。
问题
- 代码示例有问题吗?
- 是否有办法通过一些命名空间函数来克服这个问题?
- 还是说这是一个 bug?
我需要在更大的分析中使用 dplyr 和 ggparcoord(.),但这个最小化的示例反映了我所面临的问题。
版本
- R @ 3.2.3
- dplyr @ 0.4.3
- GGally @ 1.0.1
- ggplot @ 2.0.0
更新
为了总结 Joran 给出的优秀答案:
回答
- 代码示例实际上是错误的,因为 ggparcoord(.) 需要一个 data.frame,而不是钻石数据集(如果加载了 dplyr 则为 tbl_df)。
- 将 tbl_df 强制转换为 data.frame 可以解决这个问题。
- 不是 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))
[
应该始终表现出它一直以来的行为方式。然而,由于这些都属于 Hadley-verse,diamonds 数据集既是tbl_df
也是data.frame
。当加载了dplyr
后,[
的行为会被覆盖,使得对于tbl_df
,drop = FALSE
总是默认值。因此,在 GGally 中有一个地方期望data[,"cut"]
返回一个向量,但实际上它返回另一个数据框。 - jorandata[, fact.var] <- as.numeric(data[, fact.var])
时,会抛出错误。因为data[,fact.var]
仍然是一个数据框架,因此也是一个列表,as.numeric
无法正常工作。 - joran