No tidyr, que critérios a função `gather` usa para mapear um dataframe de amplo a longo?

Eu estou tentando descobrir os argumentos paragather notidyr pacote.

Eu olhei para a documentação e a sintaxe se parece com:

gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)

Há umexemplo nos arquivos de ajuda:

stocks <- data.frame(
  time = as.Date('2009-01-01') + 0:9,
  X = rnorm(10, 0, 1),
  Y = rnorm(10, 0, 2),
  Z = rnorm(10, 0, 4)
)

gather(stocks, stock, price, -time)

Estou curioso sobre a última linha:
gather(stocks, stock, price, -time)

Aqui,stocks é claramente os dados que queremos modificar, o que é bom.

Para que eu possa ler issostock eprice são argumentos para um par de valores-chave - mas como essa função decide como selecionar colunas para criar esse par de valores-chave? O dataframe original é assim:

time        X            Y          Z
2009-01-01  1.10177950  -1.1926213  -7.4149618
2009-01-02  0.75578151  -4.3705737  -0.3117843
2009-01-03  -0.23823356 -1.3497319  3.8742654
2009-01-04  0.98744470  -4.2381224  0.7397038
2009-01-05  0.74139013  -2.5303960  -5.5197743

Não vejo nenhuma indicação de que devemos usar qualquer combinação deX, Y ouZ. Quando estou usando essa função, sinto que estou apenas escolhendo nomes para o que quero que as colunas no meu dataframe formatado há muito tempo e orando para quegather funciona magicamente. Venha para pensar sobre isso, eu me sinto da mesma maneira quando eu usomelt.

Fazgather olha o tipo da coluna? Como é mapeado de largo para longo?

EDITAR Ótima resposta abaixo, ótima discussão abaixo e para qualquer pessoa que queira mais informações sobre a filosofia e o uso dotidyr pacote definitivamente deve ler issopapel, embora a vinheta não explique a sintaxe.

questionAnswers(1)

yourAnswerToTheQuestion