Как написать функцию R, которая оценивает выражение во фрейме данных

Головоломка для знатоков R: Допустим, у нас есть фрейм данных:

df <- data.frame( a = 1:5, b = 1:5 )

Я знаю, что мы можем делать такие вещи, как

with(df, a)

, чтобы получить вектор результатов.

Но как мне написать функцию, которая принимает выражение (например, a или a> 3 ) и внутри выполняет то же самое. Т.е. я хочу написать функцию fn , которая принимает в качестве аргументов фрейм данных и выражение и возвращает результат оценки выражения «внутри» фрейма данных как среды.

Неважно, что это звучит надуманным (я мог бы просто использовать с , как указано выше), но это просто упрощенная версия более сложной функции, которую я пишу. Я пробовал несколько вариантов (используя eval , с , envir , replace , local и т. Д.), Но ни один из них не работает. Например, если я определяю fn следующим образом:

fn <- function(dat, expr) {
  eval(expr, envir = dat)
}

, я получаю эту ошибку:

> fn( df, a )
Error in eval(expr, envir = dat) : object 'a' not found

Ясно, что мне не хватает чего-то тонкого в средах и оценке. Есть ли способ определить такую ​​функцию?

9
задан Prasad Chalasani 13 January 2011 в 16:50
поделиться