2016-04-21 71 views
0

我有一个字符向量(在这种情况下,十六进制颜色)。阻止重命名从另一个向量分配的向量元素

somePalette <- structure(c("#F6B436", "#4D86A0","#672767"), 
          .Names = c("Yellow", "Blue", "Purple") 
) 
pie(c(1,1,1),col=somePalette) 

从这个载体中,我希望选择几个元件传递到另一个载体(在这种情况下,用作values=参数ggplot2::scale_color_manual)。

cols <- c("setosa" = somePalette["Yellow"], 
      "versicolor" = somePalette["Blue"], 
      "virginica" = somePalette["Purple"]) 

# This doesn't work 
ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, col = Species)) + 
    geom_point(size=5) + 
    scale_color_manual(values=cols) 

看来,元素名称我试图分配已经改变,这取决于元件的指数I通过:

> print(cols) 
    setosa.Yellow versicolor.Blue virginica.Purple 
     "#F6B436"  "#4D86A0"  "#672767" 

以下的解决方法产生所需的输出:

# This works, though 
cols2 <- c("setosa" = "#F6B436", 
      "versicolor" = "#4D86A0", 
      "virginica" = "#672767") 
ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, col = Species)) + 
    geom_point(size=5) + 
    scale_color_manual(values=cols2) 

为什么会发生这种重命名? (如果它不是一个bug,那么有关此行为的文档链接将非常感激。)阻止它发生的最简单方法是什么?

回答

2
  • 发生这种情况是因为编写c()函数的人是这样设计的。就我个人而言,我没有看到任何有力的理由;我更喜欢在封闭的c()调用中指定明确的名称时剥离操作数向量的名称。

  • 我无法找到有关此行为的任何文档。

  • 我能想到以下方法来阻止发生的:


1:unname()

c(setosa=unname(somePalette['Yellow']),versicolor=unname(somePalette['Blue']),virginica=unname(somePalette['Purple'])); 
##  setosa versicolor virginica 
## "#F6B436" "#4D86A0" "#672767" 

2:[[索引。

c(setosa=somePalette[['Yellow']],versicolor=somePalette[['Blue']],virginica=somePalette[['Purple']]); 
##  setosa versicolor virginica 
## "#F6B436" "#4D86A0" "#672767" 

索引的通常形式是[。 [[可用于选择单个元素放弃名称,而[保留它们,例如c(abc = 123)[1])。

3:setNames()之后。

setNames(c(somePalette['Yellow'],somePalette['Blue'],somePalette['Purple']),c('setosa','versicolor','virginica')); 
##  setosa versicolor virginica 
## "#F6B436" "#4D86A0" "#672767" 
+2

我喜欢'setNames'解决方案,但较不详细的方式将是:'setNames(somePalette [C( '黄', '蓝', '紫')],C( 'setosa',” versicolor','virginica'))upvoted! – arvi1000

+0

感谢这个详细的答案,也感谢@ arvi1000,我也喜欢简洁的setnames版本,在我的实际用例中更易于管理。 – C8H10N4O2

相关问题