这个语法技巧的名称是什么?在哪里记录?

时间:2013-07-23 18:11:07

标签: r syntax

之前没有碰到过这个。在pairs.panelspsych的帮助页面中,可以找到以下内容:

data(iris)
pairs.panels(iris[1:4],bg=c("red","yellow","blue")[iris$Species],pch=21)

我想问一下这个参数,它设置了为数据点绘制的圆的背景颜色:bg=c("red","yellow","blue")[iris$Species]显然,这个参数将iris$Species的3个级别与一个因子相关联给出3种颜色。我不是在询问它的作用。

我想知道这种关联传递的数据与动态数据级别的关联方式是什么,以及它在何处被记录?这似乎是一些R魔法。如果我正在编写此函数,我可能会分别传递因子的颜色和列名,然后在幕后手动进行关联。这个技巧可能非常有用。但从表面上看[iris$Species]看起来数据正在索引自身。例如,您无法在控制台中键入[iris$Species],它只会出错。您可以输入c("red","yellow","blue")[iris$Species]并获得正确答案。似乎可能会有一些回收,但我不确定。我很好奇这里记录的内容,如果有人能用一两句话来解释发生了什么。例如,[iris$Species]是否被转换为整数,然后用于索引3种颜色的列表?我在想这就是它,但我想要另一种意见。

注意:graphics::pairs所基于的panels.pairs使用相同的技巧。

1 个答案:

答案 0 :(得分:7)

这里有两件事:

  1. 系数iris$Species正被强制转换为数字/整数。
  2. 这些整数索引以通常的方式使用。
  3. <强>胁迫

    这很重要,因为在这种情况下因子标签不是红色/黄色/蓝色:

    > all( c("red","yellow","blue")[iris$Species] == c("red","yellow","blue")[as.integer(iris$Species)] )
    [1] TRUE
    > all( c("red","yellow","blue")[iris$Species] == c("red","yellow","blue")[as.character(iris$Species)] )
    [1] NA
    

    使用重复元素进行索引

    在R中,无论何时索引简单向量,都会重复包含重复索引的元素。

    > x <- letters[1:5]
    > x
    [1] "a" "b" "c" "d" "e"
    > x[c(1,3)]
    [1] "a" "c"
    > x[c(1,3,3,3,3)]
    [1] "a" "c" "c" "c" "c"
    

    在更换样品时,这通常被利用。

    这在哪里记录?

    在各种各样的地方,虽然并不总是强调它有多酷。

    例如,在第11页, W。 N. Venables,D。M. Smith和R Development Core Team。关于R的注释:关于数据分析和图形的编程环境。版本2.5.0(2007-04-23)。陈述:

    > x[1:10]
    selects the first 10 elements of x (assuming length(x) is not less than 10). Also
    > c("x","y")[rep(c(1,2,2,1), times=4)]
    (an admittedly unlikely thing to do) produces a character vector of length 16 consisting of
    "x", "y", "y", "x" repeated four times.