2014-10-27 5 views
5

Я встречался с этим понятием пару раз, но не знаю, как это называется, поэтому он не может google, чтобы узнать больше. В принципе, если смотреть через функцию или даже простые команды другие написали я часто вижу что-то похожее на это:Функция (x) в R: запись «функции» без определения функции?

apply(dataset, 1:2, function(x) 10 * x) 

В этом случае, я был в состоянии понять, что как-то это «фальшивка функция» функции (х) будет просто умножать каждый элемент набора данных на 10. Это кажется полезной функцией, но я все еще не уверен, когда и как вы ее используете. Это действительно функция? Или это просто работает в рамках применяемого семейства функций? Есть ли имя для этой вещи?

+4

Это называется анонимной функцией. Это должно помочь с Googling. – joran

ответ

8

Эти функции называются «анонимными функциями», и да, они являются объектами реальных функций, которые просто не назначены ни одному символу перед использованием.

Вот соответствующий бит от R language documentation:

Обычно функции присваиваются символы, но они не должны быть. Значение, возвращаемое вызовом функции, является функцией. Если это имя не указано, оно называется анонимной функцией. Анонимные функции чаще всего используются в качестве аргументов для других функций, таких как семейство приложений или внешний.

Хотя они чаще всего используются в *apply() функций, они не должны быть, как можно увидеть здесь, например

(function(x,y){x*y + x/y})(2,5) 
# [1] 10.4 
6

Вы имеете в виду lambda (анонимные функции)? Вы можете поместить что-то подобное в вашем ~/.Rprofile файле:

`{` <- function(...) 
    base::`{`(
    if (length(sys.calls()) >= 4 && 
     identical(as.character(sys.call()[[1]]), "{") && 
     identical(as.character(sys.call(-4)[[1]]), "{")) 
     base::`{`(fn <- new('function'), 
     formals(fn) <- alist(x=), body(fn) <- sys.call(), fn) 
    else eval.parent(substitute(base::`{`(...))) 
) 

Затем вы можете сделать что-то вроде:

sapply(1:10, {{x + 5}}) 
# [1] 6 7 8 9 10 11 12 13 14 15 

Это ближе к языкам как Ruby, или CoffeeScript, которые не должны вызывать ключевое слово сделать лямбду (там они используют ->, но это уже сделано в R, поэтому я использовал двойные фигурные скобки). Я просто придумал это, поэтому, если есть ошибки, дайте мне знать.

+2

Это, вероятно, совсем не помогает OP, но это интересная идея. Я, я частично перегружен '->'.] (Https://gist.github.com/klmr/25dc765211c59bb749b0) –

+0

Моя проблема в том, что большинство людей, с которыми я работаю, фактически используют '->' для назначения при случайном перемещении в консоли - проще, чем вернуться к началу –

+0

Я думаю, вы могли бы превратить '%>%' в 'base :: \' <- \ ''? –

Смежные вопросы