Я наткнулся на это поведение:
x <- 1:5
> tracemem(x)
[1] "<0x12145b7a8>"
> "names<-"(x, letters[1:5])
a b c d e
1 2 3 4 5
> x
a b c d e
1 2 3 4 5
> y <- 1L
> tracemem(y)
[1] "<0x12587ed68>"
> "names<-"(y,letters[1])
tracemem[0x12587ed68 -> 0x12587efa8]:
a
1
> y
[1] 1
при попытке помочь кому-то выяснить почему в первом случае имена векторов изменяются, но в последнем они не являются.
Ясно, что копируется длина одного вектора, а вектор длины 5 изменяется на месте:
> x <- 1:5
> y <- 1L
> .Internal(inspect(x))
@121467490 13 INTSXP g0c3 [MARK,NAM(1)] (len=5, tl=0) 1,2,3,4,5
> .Internal(inspect(y))
@1258d74d8 13 INTSXP g0c1 [NAM(2)] (len=1, tl=0) 1
Почему длина одного вектора начинается с его свойства NAMED, увеличенного до 2?
В ответ на комментарий @nograpes ниже, я вижу это на OS X 10.7.5 и R 3.0.2.