为什么是:
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
是多余的(缺少右括号)。而且我认为这并不构成上述行为的文档。 最佳答案
这是一个很好的观察,将我带到了实际的C代码(因为c()
是原始函数)。只是分享我对代码的观察。
在为R执行此do_c()
的actual C代码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. */
因此,对于您的问题,似乎没有任何文件可以证明使用序列生成属性名称并将其分配给结果的地方。
希望能帮助到你。