为什么:
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
是多余的(并且缺少右括号)。而且我认为这不等于上述行为的记录。
答案 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. */
因此,对于您的问题,似乎没有记录使用序列生成属性名称并将其分配给结果的任何位置。
希望它有所帮助。