Почему символ R и числовые векторы равны в определенных контекстах? - PullRequest
0 голосов
/ 06 июня 2018

Я заметил, что в 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

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Для ваших примеров с индексами списков сравните документацию для базовой функции поднабора:? `[`

Индексы - это числовые или символьные векторы, либо пустые (отсутствующие), либо NULL.Числовые значения приводятся к целому числу как as.integer (и, следовательно, усекаются до нуля).Символьные векторы будут сопоставлены с именами объекта (или для матриц / массивов, dimnames): см. «Индексы символов» ниже для получения дополнительной информации.

Обратите внимание, что это ничего не говорит о принудительных целочисленных векторахк характеру, как вы ожидаете в вашем вопросе.Ваш рабочий пример выполнен успешно, потому что имена списков ('1', '2') соответствуют целочисленным индексам.Последний сбой, потому что нет элемента списка с целочисленным индексом 23.

0 голосов
/ 06 июня 2018

Прочитайте это недавнее сообщение: Почему as.numeric (1) == (3 | 4) оценивается как TRUE?

В частности:

правила приведения для операторов сравнения (?Comparison) говорят нам, что:

Если два аргумента являются атомными векторами разных типов, один приведен к типу другого,убывающий) порядок старшинства, являющийся символом, сложным, числовым, целым, логическим и необработанным*

Другие операции, которые вы пытаетесь выполнить, не относятся к этим правилам принуждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...