2015-11-19 2 views
2

Почему следующие работы:передавая анонимную функцию в качестве аргумента

foo <- function(x) {x} 
curve(foo) 
# plots the identity function between 0 and 1 

И это не делает:

curve(function(x) {x}) 

Ошибка в кривой (функция (х) {: 'выражение' не оценивается объектом длины «n»

И еще

# the anonymous function can be called 
foo(1) #1 
(function(x) x)(1) #1 


all.equal(foo, function(x) {x}) 
# TRUE 

Я пробовал различные комбинации «quote()» и «expression()» без каких-либо результатов.

+2

from '? Curve': expr: имя функции или вызов или выражение, написанное как функция Икс. Так что 'curve ({x})' работает, например. Вам просто нужно удалить функцию (x) '. Вы также можете удалить скобки. – etienne

+0

О, я прочитал справку, но это заставило меня попробовать «curve (x)» и «curve (quote (x))», которые оба не удалось ... –

+0

, так как 'x' не является самой функцией, вам нужно скобки, но вы можете использовать 'curve (sin (x))' или 'curve ({sin (x)})' (чтобы прояснить мой комментарий об удалении скобок) – etienne

ответ

2

?curve указывает, что expr (первый аргумент) должен быть именем функции, вызова или выражения, записанного как функция от x, которое будет оцениваться объектом с такой же длиной, как x.

Таким образом, curve({x}) даст ожидаемый результат.

Что касается причины, почему curve(function(x){x})втоматическая ошибка, код curve поможет. В конце определения функции, мы имеем:

y <- eval(expr, envir = ll, enclos = parent.frame()) 
    if (length(y) != length(x)) 
     stop("'expr' did not evaluate to an object of length 'n'") 

и мы имеем:

eval(function(x){x}) 
# function(x){x} 

и x определяется в коде функции, как seq.int(0, 1, length.out = 101).

Таким образом, с вызовом у нас есть ошибка как eval как длина 1, которая не то, что мы хотели.

3

На самом деле справочная страница для curve делает не говорит, что аргумент «expr» может быть функциональным объектом. Три типа принятых аргументов: «имя функции или вызов или выражение, написанное как функция x, которое будет оцениваться объектом с такой же длиной, как и x». (Курсив наш.)

Все перечисленное успеха:

curve((function(x) {x})(x)) 
curve(local(x) ) 
curve(eval(x) ) 

Когда вы увидели, что ...

all.equal(foo, function(x) {x}) 
# TRUE 

... это говорит о том, что объект языка, связанного с именем foo был таким же, как function(x) {x}. (Функция all.equal.language депарафинирует объект (ы) или имена объектов и сравнивает результаты символа.)

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