лямбда-подобные функции в R? - PullRequest
33 голосов
/ 20 октября 2011

Мне нужно использовать / выучить R для новой лекции в универе, и в настоящее время я немного борюсь с ее синтаксисом.Я хочу построить (через curve) простую функцию, но не могу заставить ее работать со встроенной лямбда-подобной функцией.

Я пробовал следующее:

> curve( function(x) x^2 )
Error in curve(function(x) x^2) : 
  'expr' did not evaluate to an object of length 'n'

Однако когда я сначала сохраняю функцию в переменной, она работает:

> quad <- function(x) x^2
> curve( quad )

Разве такое встроенное использование не разрешено в R?Есть ли другой способ сделать эту работу без определения дополнительной функции?Спасибо!

Ответы [ 2 ]

44 голосов
/ 31 марта 2014

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

(function (x) x+1) (1)
{function (x,y) x^y} (2,3)

В случае curve первый аргумент является либо выражением, либо именем функции, но если это имя функции, то он сначала преобразуется в выражение. (Смотрите первые несколько строк в исходном коде curve). Поэтому, если это не имя функции, вам понадобится выражение, которое может содержать функцию «лямбда»:

curve((function (x) x^2)(x))

Если вы хотите использовать функцию (в отличие от ее имени) в качестве аргумента, вы можете использовать plot.function:

plot(function(x) x^2)
21 голосов
/ 20 октября 2011

Вам нужно посмотреть на источник curve, чтобы оценить происходящее (просто наберите curve в приглашении и нажмите ввод).

Там вы можете найти, как переданное выражение анализируется.

Единственный способ обнаружить функцию как таковую - это когда передается только ее имя (см. Часть is.name). Если это не так, выражение вызывается для каждого x. В вашем случае: для каждого x результатом является функция, которая не является удачной мыслью для построения ...

Короче говоря: нет, вы не можете делать то, что пытались, но, как указано @ROLO, вы можете сразу передать тело функции, которое будет проанализировано как выражение (и должно содержать x). Если это содержит несколько операторов, просто заключите их в фигурные скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...