R - как обрабатываются имена элементов?

Я заметил эту неожиданную особенность:

foo <- list(whatever=1:10)

Теперь также работает следующее:

foo$wha
foo$w
foo$whateve

Однако, следующее:

foo[["wha"]]

Это имеет неожиданные последствия (неожиданно для меня), если у вас есть два потенциальных имени, например "CXCL1" и "CXCL11", и вы хотите знать, не является ли CXCL1 недействительным, проверив !is.null(foo$CXCL1), он вернет TRUE, даже если CXCL1 null, но CXCL11 не является.

Мои вопросы:

  • Как это работает?
  • В чем разница между foo$whatever и foo[["whatever"]]?
  • Почему кому-то нужно это поведение и как его отключить?

Ответ 1

  • Частичное сопоставление работает только с уникальными исходными подпоследовательностями имен списков. Итак, например:

    > l <- list(score=1, scotch=2)
    > l$core #only INITIAL subsequences
    NULL
    > l$sco #only UNIQUE subsequences
    NULL
    > l$scor
    [1] 1
    
  • Оба [[ и $ выбирают один элемент списка. Основные отличия заключаются в том, что $ не позволяет вычислять индексы, тогда как [[ делает, и что частичное сопоставление разрешено по умолчанию с помощью оператора $, но не с [[.

  • Эти операторы извлечения или замены исходят из S, хотя R ограничивает использование частичного соответствия, тогда как S по умолчанию использует частичное согласование в большинстве операторов.

В вашем примере, если CXCL1 и CXCL11 сосуществуют, и вы индексируете foo$CXCL1, это не частичное совпадение и должно возвращать значение CXCL1. Если нет, может быть, есть и другая проблема.

Я должен указать, [[ не позволяет частичное совпадение, поскольку по умолчанию начинается с версии R 2.7.0 и далее.