Очень запутанная функция R - заполнение имен элементов списка - PullRequest
0 голосов
/ 28 августа 2018

Я нашел очень удивительную и неприятную особенность R - она ​​дополняет имена элементов списка !!! Смотрите следующий код:

a <- list(cov_spring = "spring")
a$cov <- c()
a$cov
# spring  ## I expect it to be empty!!! I've set it empty!
a$co
# spring
a$c 

Я не знаю, что с этим делать .... Мне нужно иметь возможность установить $ cov в NULL и одновременно иметь $ cov_spring !!! И используйте $ cov отдельно !! Это раздражает!

Мой вопрос:

  1. Что здесь происходит? Как это возможно, в чем логика?
  2. Есть ли какое-то простое исправление, как отключить это завершение? Мне нужно использовать элементы списка cov_spring и cov независимо, как будто они являются обычными переменными. Нет, черт возьми, пожалуйста!

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

С help("$"):

'x$name' is equivalent to 'x[["name", exact = FALSE]]'

Когда вы прокручиваете назад и читаете на exact=:

exact: Controls possible partial matching of '[[' when extracting by
      a character vector (for most objects, but see under
      'Environments').  The default is no partial matching.  Value
      'NA' allows partial matching but issues a warning when it
      occurs.  Value 'FALSE' allows partial matching without any
      warning.

Таким образом, это обеспечивает возможность частичного сопоставления в индексах и $ и [[:

mtcars$cy
#  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
mtcars[["cy"]]
# NULL
mtcars[["cy", exact=FALSE]]
#  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4

Я не вижу способа отключить exact=FALSE значение по умолчанию для $ (если вы не хотите связываться с formals, что я не рекомендую для воспроизводимости и последовательное поведение).

При программном использовании фреймов и списков (в оборонительных целях) следует предпочитать [[ над $ именно по этой причине. (Это редко, но я был укушен этим разрешающим поведением.)

Редактировать :

Для ясности по этому последнему пункту:

  • mtcars$cyl становится mtcars[["cyl"]]
  • mtcars$cyl[1:3] становится mtcars[["cyl"]][1:3]
  • mtcars[,"cy"] не является проблемой, а также mtcars[1:3,"cy"]
0 голосов
/ 28 августа 2018

Вместо этого можно использовать [ или [[.

a["cov"] вернет список с элементом NULL. a[["cov"]] вернет элемент NULL напрямую.

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