Можно создать дубликат:
How to write an R function that evaluates an expression within a data-frameПочему в этой функции R нет ленивой оценки?
Я хочу, чтобы написать функцию, которая сортирует data.frame - вместо того, чтобы использовать громоздкий порядок(). Принимая во внимание то, как
> x=data.frame(a=c(5,6,7),b=c(3,5,1))
> x
a b
1 5 3
2 6 5
3 7 1
Я хочу сказать, что-то вроде:
sort.df(x,b)
Так вот моя функция:
sort.df <- function(df, ...) {
with(df, df[order(...),])
}
Я был очень горд этим. Учитывая ленивую оценку R, я решил, что параметр ... будет оцениваться только тогда, когда это необходимо, и к тому времени он будет в области видимости, из-за «с».
Если я запускаю линию «с» напрямую, она работает. Но функция не работает.
> with(x,x[order(b),])
a b
3 7 1
1 5 3
2 6 5
> sort.df(x,b)
Error in order(...) : object 'b' not found
Что не так и как исправить? Например, я часто вижу такие «магии» в таких пакетах, как plyr. Какая уловка?
sort.df (х, х $ б) работает, но до сих пор я понятия не имею, почему сортировки. df (x, b) не работает – Ali
См. также 'plyr :: arr', который выполняет именно это. – hadley
Спасибо! Я не знал об аранжировании, несмотря на то, что каждый день использовал плыр. Еще один пример того, что трудно найти правильные решения в мире R - и так много хорошего программирования R - это изучение лучших практик с использованием нескольких хороших пакетов. –