Как указано 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() с точно такими же аргументами, которая была бы безопасна в программировании, то есть могла бы оценить ее состояние, пока она вызывалась другой функцией?