subset()
сначала заглянет в рамки данных для любого объекта, который вы упомянули, поэтому в вашем первом примере Species[i]
возвращает «setosa» (то же, что и iris$Species[i]
). Только когда объект, указанный вами, не может быть найден внутри фрейма данных, R будет выглядеть в родительских кадрах и найдет там правильный объект.
Так что все работает, вы просто не понимаете, как это работает. Вы могли бы прочитать в файлах справки:
Обратите внимание, что подмножество будет оцениваться в кадре данных, так что столбцы могут называться (по имени) в качестве переменных в выражении (см примеры).
Как это происходит?
Причина заключается в том, что следующие строки кода в subset()
:
e <- substitute(subset)
r <- eval(e, x, parent.frame())
subset
(или e
) находится в вашем примере Species == Species[i]
x
находится в вашем примере iris
parent.frame()
возвращается в ваш пример глобальной среды.
Второй аргумент вызова eval
, x
называется envir
. Это среда (или список или кадр данных, ...), где выражение оценивается. В вашем случае R оценивает Species == Species[i]
внутриx
, который является вашим фреймом данных.
Третий аргумент, parent.frame()
, является корпусом. Это среда, в которой содержится кадр данных, который вы указали в среде als, и это место, где R будет выглядеть в случае, если переменные не найдены в фрейме данных.
См. Также? eval