【问题标题】:prevent renaming of vector elements assigned from another vector防止重命名从另一个向量分配的向量元素
【发布时间】:2016-08-15 02:39:00
【问题描述】:

我有一个字符向量(在本例中为十六进制颜色)。

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)

似乎我尝试分配的元素名称已更改,具体取决于我传递的元素的索引:

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

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

【问题讨论】:

    标签: r


    【解决方案1】:
    • 这是因为编写 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"
    

    【讨论】:

    • 我喜欢setNames 解决方案,但更简洁的方法是:setNames(somePalette[c('Yellow', 'Blue', 'Purple')], c('setosa','versicolor','virginica')) 已投票!
    • 感谢您的详细回答以及@arvi1000,我也喜欢简洁的 setnames 版本,在我的实际用例中更易于管理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多