Why does the following work:
foo <- function(x) {x}
curve(foo)
# plots the identity function between 0 and 1
And this does not:
?curve
states that expr
(the first argument) should be the name of a function, a call or an expression written as a function of x which will evaluate to an object of the same length as x.
Thus, curve({x})
will yield the expected result.
As to why curve(function(x){x})
returns an error, reading the code of curve
will help. At the end of the function definition, we have :
y <- eval(expr, envir = ll, enclos = parent.frame())
if (length(y) != length(x))
stop("'expr' did not evaluate to an object of length 'n'")
and we have :
eval(function(x){x})
# function(x){x}
and x
is defined in the function code as seq.int(0, 1, length.out = 101)
.
So with the call we have the error as the eval
as a length of 1 which is not what we wanted.