了解c()对命名向量的影响

时间:2018-02-15 08:25:43

标签: r list vector concatenation

为什么:

c(d = 1:3)

等于命名向量,如:

d1 d2 d3 
1  2  3 

这种行为记录在哪里?

c帮助文件确实说:

## do *not* use
c(ll, d = 1:3) # which is == c(ll, as.list(c(d = 1:3))

但是as.list是多余的(并且缺少右括号)。而且我认为这不等于上述行为的记录。

2 个答案:

答案 0 :(得分:2)

您可以修改此行为,更改use.names参数:

c(d = 1:3)
d1 d2 d3 
 1  2  3 
c(d = 1:3,use.names=F)
[1] 1 2 3

此处有更多详情: https://www.rdocumentation.org/packages/base/versions/3.4.3/topics/c

答案 1 :(得分:2)

这是一个很好的观察,它把我带到了实际的C代码(因为c()是一个原始函数)。只是从代码中分享我的观察。

actual C代码do_c()函数中为R执行此c(),在该函数内部有一个专门用于为输出分配属性的部分。

/* Build and attach the names attribute for the returned object. */

    if (data.ans_nnames && data.ans_length > 0) {
    PROTECT(data.ans_names = allocVector(STRSXP, data.ans_length));
    data.ans_nnames = 0;
    while (args != R_NilValue) {
        struct NameData nameData;
        nameData.seqno = 0;
        nameData.count = 0;
        NewExtractNames(CAR(args), R_NilValue, TAG(args), recurse, &data, &nameData);
        args = CDR(args);
    }
    setAttrib(ans, R_NamesSymbol, data.ans_names);
    UNPROTECT(1);
    }

告诉我们NewExtractNames()是专门创建名称并探索我们可以找到序列创建信息的函数

/* NewExtractNames(v, base, tag, recurse):  For c() and  unlist().
 * On entry, "base" is the naming component we have acquired by
 * recursing down from above.
 *  If we have a list and we are recursing, we append a new tag component
 * to the base tag (either by using the list tags, or their offsets),
 * and then we do the recursion.
 *  If we have a vector, we just create the tags for each element. */

因此,对于您的问题,似乎没有记录使用序列生成属性名称并将其分配给结果的任何位置。

希望它有所帮助。