С 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"]