Я заметил, что в R
символьные векторы чисел эквивалентны их соответствующим числовым векторам.
"1234" == 1234
# [1] TRUE
c("1", "2", "3") == 1:3
# [1] TRUE TRUE TRUE
all(c("1", "2", "3") == 1:3)
# [1] TRUE
При использовании all.equal()
мы получаем сообщение о том, что режимы отличаются.
all.equal(c("1", "2"), c(1, 2))
# [1] "Modes: character, numeric" "target is character, current is numeric"
Это становится еще сложнее при использовании списков.
myList <- list("1"="a", "2"=c("b", "c"))
myList[c("2", "1")]
# $`2`
# [1] "b" "c"
#
# $`1`
# [1] "a"
myList[2:1]
# $`2`
# [1] "b" "c"
#
# $`1`
# [1] "a"
myList[[2]]
# [1] "b" "c"
На этом этапе можно сделать вывод, что числовые и символьные векторы могут использоваться взаимозаменяемо при доступе к списку.Но тогда ...
myList2 <- list("1"="a", "23"=c("b", "c"))
myList2[c(23, 1)]
# $<NA>
# NULL
#
# $`1`
# [1] "a"
myList2[[23]]
# Error in myList2[[23]] : subscript out of bounds
myList2[["23"]]
# [1] "b" "c"
Чем объясняется такое поведение?
R версия 3.5.0