lambda-like functions in R?

50,338

Solution 1

You have to look at the source of curve to appreciate what is happening (just type curve 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.namepart). If that is not the case, the expression is called for every x. In your case: for every x, 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.

Solution 2

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:

(function (x) x+1) (1)
{function (x,y) x^y} (2,3)

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 of curve). So if its' not a function name, you'll need an expression – which may contain a "lambda" function:

curve((function (x) x^2)(x))

If you want to use a function (as opposed to its name) as the argument, you can use plot.function:

plot(function(x) x^2)

Solution 3

From R 4.1 on, you can use \(x) lambda-like shorthand:

R now provides a shorthand notation for creating anonymous functions,
e.g. \(x) x + 1 is parsed as function(x) x + 1.

With function(x) x^2:

(\(x) x^2)(2)
#[1] 4

This can be used with curve :

curve((\(x) x^2)(x))

enter image description here

But as stated in comments, in this case an expression is more straightforward :

curve(x^2)
Share:
50,338
poke
Author by

poke

M.Sc. in computer science, .NET software engineer, web developer, Python developer, lots of other things-developer…

Updated on July 09, 2022

Comments

  • poke
    poke almost 2 years

    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!