I’m required to use/learn R for a new lecture at uni and I’m currently struggling a bit with its syntax. I want to plot (via curve
) a simple function, but I can’t seem to get it working with an inline lambda-like function.
I’ve tried the following:
> curve( function(x) x^2 )
Error in curve(function(x) x^2) :
'expr' did not evaluate to an object of length 'n'
When I however store the function in a variable first, it works:
> quad <- function(x) x^2
> curve( quad )
Is such an inline use not allowed in R? Is there any other way to make this work without defining an extra function? Thanks!
Just for completeness. You can use "lambda-like" (anonymous) functions in R but if you want to put them to immediate use, you need to enclose the function definition in parentheses or curly braces:
In the case of
curve
the first argument is either expression or a function name - but if it is a function name then it is first converted to an expression. (See first few lines in the source code ofcurve
). So if its' not a function name, you'll need an expression – which may contain a "lambda" function:If you want to use a function (as opposed to its name) as the argument, you can use plot.function:
You have to look at the source of
curve
to appreciate what is happening (just typecurve
at the prompt and press enter).There you can find how the expression passed is parsed.
The only way a function is discovered as being just that, is when only its name is passed along (see the
is.name
part). If that is not the case, the expression is called for everyx
. In your case: for everyx
, the result is a function, which is not a happy thought for plotting...So in short: no you cannot do what you tried, but as @ROLO indicated, you can immediately pass the function body, which will be parsed as an expression (and should contain
x
). If this holds multiple statements, just enclose them in curly braces.