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.