Estou gerando códigos de cores hexadecimais. Em R3.6.2
paste(as.hexmode(c(213,94,0)))
gera
"d5" "5e" "00"
Enquanto em R4.4.1 ele gera
"d5" "5e" "0"
resultando em um hexcode inválido ( "#d55e0"
) e código quebrado
paste()
agora parece não reconhecer o atributo 'hexmode' - em vez disso, trata o resultado de as.hexmode() como um inteiro simples. Essa mudança é esperada?
Sim, isso é esperado. Uma mudança no R 4.2 foi:
No R 3.6,
as.character.hexmode(x)
havia um wrapper paraformat.hexmode(x)
:Entretanto, em R ≥ 4.2, é basicamente equivalente a
sprintf("%x", as.integer(x))
:Aparentemente, isso tem consequências surpreendentes para você e outros que dependem de zero-padding. Esta mensagem de Martin Maechler (membro da equipe principal do R) explica a lógica. Em qualquer caso, para obter o comportamento desejado, você pode usar
format.hexmode()
diretamente:O comportamento de
format.hexmode()
é preencher automaticamente a largura com o máximo de dígitos de qualquer valor no vetor, que neste caso é dois, entãowidth = 2
não é necessário aqui. No entanto, pode ser melhor definir explicitamente comwidth
o argumento cover all cases. Por exemplo, se você estivesse gerando o código para black, você precisaria definirwidth
para obter uma saída preenchida com zeros:O uso
format.hexmode()
replicará opaste()
comportamento do R 3.6 em R ≥ 4.2 e <4.2.0
O motivo pelo qual você obteve isso00
foi respondido de forma excelente na solução do SamR .Aqui está apenas uma solução alternativa. Você pode usar
as.character.numeric_version
em vez deas.character