Подтвердить что ты не робот

Лямбда-подобные функции в R?

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

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

> 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? Есть ли другой способ сделать эту работу без определения дополнительной функции? Спасибо!

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Просто для полноты. Вы можете использовать "лямбда-подобные" (анонимные) функции в 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)