Это происходит потому, что атрибуты доступа , (.
и []
) преобразуют значение ToObject .
Что-то подобное этому происходит за кадром:
var a="abc";
new Object(a).b = 123;
alert(a.b); // undefined
В принципе, объект создается «на лету» с помощью аксессуаров свойств, см. Шаг 5:
Произведение MemberExpression
: MemberExpression [ Expression ]
( или MemberExpression . Identifier
) оценивается следующим образом:
MemberExpression
. GetValue(Result(1))
. GetValue(Result(3))
. ToObject(Result(2))
. ToString(Result(4))
. Result(6)
. Это также должно распространяться на большее количество случаев (например, время3, измерение3, время4, измерение4 и т. Д.) При условии, что каждый из них заканчивается цифрой. Хитрость заключается в том, чтобы сначала gather()
поднять все столбцы без переменных, а затем separate()
с тщательно выбранным аргументом sep
.
library(tidyverse)
df %>%
gather(key, value, -id) %>%
separate(key, c("var", "num"), sep = "(?=[[:digit:]])") %>%
spread(var, value) %>%
arrange(id) %>%
select(-num)