Как указано subset()
:
Предупреждение. Это удобная функция, предназначенная для интерактивного использования.
Я узнал из эту замечательную статью не только секрет этого предупреждения, но и хорошее понимание substitute()
, match.call()
, eval()
, quote()
, call
, promise
и другие связанные с ним объекты R, которые немного сложны.
Теперь я понимаю, для чего это предупреждение. Суперпростая реализация subset()
может быть следующей:
subset = function(x, condition) x[eval(substitute(condition), envir=x),]
Пока subset(mtcars, cyl==4)
возвращает таблицу строк в mtcars
, удовлетворяющую cyl==4
, обтекание subset()
в другой функции не выполняется:
sub = function(x, condition) subset(x, condition)
sub(mtcars, cyl == 4)
# Error in eval(expr, envir, enclos) : object 'cyl' not found
Использование исходной версии subset()
также дает точно такое же условие ошибки. Это связано с ограничением пары substitute()-eval()
: она отлично работает, а condition
- cyl==4
, но когда condition
передается через огибающую функцию sub()
, аргумент condition
subset()
будет больше не cyl==4
, а вложенный condition
в тело sub()
, а eval()
- неудачно - это немного сложно.
Но существует ли какая-либо другая реализация subset()
с точно такими же аргументами, которая была бы безопасна в программировании, то есть могла бы оценить ее состояние, пока она вызывалась другой функцией?