Julius Schmid
Functions Are Objects
R functions are first-class objects (of the class “function”, of
course), meaning that they can be used for the most part just like other
objects. This is seen in the syntax of function creation:
g <- function(x) {
return(x+1)
}
Here, function() is a built-in R function whose job is to create
functions! On the right-hand side, there are really two arguments to
function(): The first is the formal argument list for the function we’re
creating — here, just x — and the second is the body of that function —
here, just the single statement return(x+1). That second argument must
be of class “expression”. So, the point is that the right-hand side
creates a function object, which is then assigned to g.
Note that for the first argument x, we could either have a single
number (which g increases by 1) or a vector of numbers (where g
increases each component separately by 1).
The two arguments to function() can later be accessed via the R
functions formals() and body(), as
follows:
Let us start with the function formals(). This function returns the
first argument, i. e. all variables that are used in the definition of
the function:
formals(g)
$x
For the function g this is just the one variable x.
Now, let us apply the body() function. It returns the concrete
definition of the function, depending on all variables that are put in
the first argument (which are just the variables that the formals()
function returns).
body(g)
{
return(x + 1)
}
The body() function prints everything within the brackets for the
definition of the function. The important part here is “return(x + 1)”
which exactly says that for an input x, we return x + 1.
Recall that when using R in interactive mode, simply typing the name
of an object results in printing that object to the screen. Functions
are no exception, since they are objects just like anything else. Hence,
we just need to call g in order to see how the function is defined:
g
function(x) {
return(x+1)
}
Now, we create a function h and simulate a similar case scenario to
the one shown above.
#Enter Answer Here
h <- function(y,z) {
return(y^2 + 2 * y * z - z)
}
The function h now has two variables as the first input argument.
Note that these two variables could be single numbers, as well as
vectors.
Just as we did for g, we call the function formals() for h. This
function returns the first argument, i. e. all variables that are used
in the definition of the function:
formals(h)
$y
$z
We see that this time we do not only have one variable, but two! h is
defined in dependence of y and z, which is exactly our output.
Let us again apply the body() function. Recall that it returns the
concrete definition of the function, depending on all variables that are
put in the first argument.
body(h)
{
return(y^2 + 2 * y * z - z)
}
We obtain the concrete function definition which uses the variables y
and z, which is just the result of y^2 + 2 * y * z - z.
Let us evaluate the function for the concrete values y = 1, z =
5.
h(1,5)
[1] 6
So h(1,5) = 6.
If you’re using a function that you wrote but which you’ve forgotten
the details of. Printing out a function is also useful if you are not
quite sure what an R library function does. By looking at the code, you
may understand it better. For example, if you are not sure as to the
exact behavior of the graphics function abline(), you could browse
through its code to better understand how to use it.
LS0tCnRpdGxlOiAiRnVuY3Rpb25zIGluIFIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCkp1bGl1cyBTY2htaWQKCioqRnVuY3Rpb25zIEFyZSBPYmplY3RzKioKClIgZnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzIChvZiB0aGUgY2xhc3MgImZ1bmN0aW9uIiwgb2YgY291cnNlKSwgbWVhbmluZyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgZm9yIHRoZSBtb3N0IHBhcnQganVzdCBsaWtlIG90aGVyIG9iamVjdHMuIFRoaXMgaXMgc2VlbiBpbiB0aGUgc3ludGF4IG9mIGZ1bmN0aW9uIGNyZWF0aW9uOgpgYGB7cn0KZyA8LSBmdW5jdGlvbih4KSB7CiByZXR1cm4oeCsxKQogfQpgYGAKCkhlcmUsIGZ1bmN0aW9uKCkgaXMgYSBidWlsdC1pbiBSIGZ1bmN0aW9uIHdob3NlIGpvYiBpcyB0byBjcmVhdGUgZnVuY3Rpb25zISBPbiB0aGUgcmlnaHQtaGFuZCBzaWRlLCB0aGVyZSBhcmUgcmVhbGx5IHR3byBhcmd1bWVudHMgdG8gZnVuY3Rpb24oKTogVGhlIGZpcnN0IGlzIHRoZSBmb3JtYWwgYXJndW1lbnQgbGlzdCBmb3IgdGhlIGZ1bmN0aW9uIHdl4oCZcmUgY3JlYXRpbmcg4oCUIGhlcmUsIGp1c3QgeCDigJQgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIGJvZHkgb2YgdGhhdCBmdW5jdGlvbiDigJQgaGVyZSwganVzdCB0aGUgc2luZ2xlIHN0YXRlbWVudCByZXR1cm4oeCsxKS4gVGhhdCBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBvZiBjbGFzcyAiZXhwcmVzc2lvbiIuIFNvLCB0aGUgcG9pbnQgaXMgdGhhdCB0aGUgcmlnaHQtaGFuZCBzaWRlIGNyZWF0ZXMgYSBmdW5jdGlvbiBvYmplY3QsIHdoaWNoIGlzIHRoZW4gYXNzaWduZWQgdG8gZy4KCk5vdGUgdGhhdCBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50IHgsIHdlIGNvdWxkIGVpdGhlciBoYXZlIGEgc2luZ2xlIG51bWJlciAod2hpY2ggZyBpbmNyZWFzZXMgYnkgMSkgb3IgYSB2ZWN0b3Igb2YgbnVtYmVycyAod2hlcmUgZyBpbmNyZWFzZXMgZWFjaCBjb21wb25lbnQgc2VwYXJhdGVseSBieSAxKS4KCgpUaGUgdHdvIGFyZ3VtZW50cyB0byBmdW5jdGlvbigpIGNhbiBsYXRlciBiZSBhY2Nlc3NlZCB2aWEgdGhlIFIgZnVuY3Rpb25zICoqZm9ybWFscygpKiogYW5kICoqYm9keSgpKiosIGFzIGZvbGxvd3M6CgpMZXQgdXMgc3RhcnQgd2l0aCB0aGUgZnVuY3Rpb24gZm9ybWFscygpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50LCBpLiBlLiBhbGwgdmFyaWFibGVzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uOgpgYGB7cn0KZm9ybWFscyhnKQpgYGAKRm9yIHRoZSBmdW5jdGlvbiBnIHRoaXMgaXMganVzdCB0aGUgb25lIHZhcmlhYmxlIHguIAoKTm93LCBsZXQgdXMgYXBwbHkgdGhlIGJvZHkoKSBmdW5jdGlvbi4gSXQgcmV0dXJucyB0aGUgY29uY3JldGUgZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb24sIGRlcGVuZGluZyBvbiBhbGwgdmFyaWFibGVzIHRoYXQgYXJlIHB1dCBpbiB0aGUgZmlyc3QgYXJndW1lbnQgKHdoaWNoIGFyZSBqdXN0IHRoZSB2YXJpYWJsZXMgdGhhdCB0aGUgZm9ybWFscygpIGZ1bmN0aW9uIHJldHVybnMpLiAgCmBgYHtyfQpib2R5KGcpCmBgYApUaGUgYm9keSgpIGZ1bmN0aW9uIHByaW50cyBldmVyeXRoaW5nIHdpdGhpbiB0aGUgYnJhY2tldHMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGltcG9ydGFudCBwYXJ0IGhlcmUgaXMgInJldHVybih4ICsgMSkiIHdoaWNoIGV4YWN0bHkgc2F5cyB0aGF0IGZvciBhbiBpbnB1dCB4LCB3ZSByZXR1cm4geCArIDEuCgpSZWNhbGwgdGhhdCB3aGVuIHVzaW5nIFIgaW4gaW50ZXJhY3RpdmUgbW9kZSwgc2ltcGx5IHR5cGluZyB0aGUgbmFtZSBvZiBhbiBvYmplY3QgcmVzdWx0cyBpbiBwcmludGluZyB0aGF0IG9iamVjdCB0byB0aGUgc2NyZWVuLiBGdW5jdGlvbnMgYXJlIG5vIGV4Y2VwdGlvbiwgc2luY2UgdGhleSBhcmUgb2JqZWN0cyBqdXN0IGxpa2UgYW55dGhpbmcgZWxzZS4gSGVuY2UsIHdlIGp1c3QgbmVlZCB0byBjYWxsIGcgaW4gb3JkZXIgdG8gc2VlIGhvdyB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZDoKYGBge3J9CmcKYGBgCgpOb3csIHdlIGNyZWF0ZSBhIGZ1bmN0aW9uIGggYW5kIHNpbXVsYXRlIGEgc2ltaWxhciBjYXNlIHNjZW5hcmlvIHRvIHRoZSBvbmUgc2hvd24gYWJvdmUuIAoKYGBge3J9CiNFbnRlciBBbnN3ZXIgSGVyZQoKaCA8LSBmdW5jdGlvbih5LHopIHsKICByZXR1cm4oeV4yICsgMiAqIHkgKiB6IC0geikKfQpgYGAKVGhlIGZ1bmN0aW9uIGggbm93IGhhcyB0d28gdmFyaWFibGVzIGFzIHRoZSBmaXJzdCBpbnB1dCBhcmd1bWVudC4gTm90ZSB0aGF0IHRoZXNlIHR3byB2YXJpYWJsZXMgY291bGQgYmUgc2luZ2xlIG51bWJlcnMsIGFzIHdlbGwgYXMgdmVjdG9ycy4gCgpKdXN0IGFzIHdlIGRpZCBmb3IgZywgd2UgY2FsbCB0aGUgZnVuY3Rpb24gZm9ybWFscygpIGZvciBoLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50LCBpLiBlLiBhbGwgdmFyaWFibGVzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uOgpgYGB7cn0KZm9ybWFscyhoKQpgYGAKV2Ugc2VlIHRoYXQgdGhpcyB0aW1lIHdlIGRvIG5vdCBvbmx5IGhhdmUgb25lIHZhcmlhYmxlLCBidXQgdHdvISBoIGlzIGRlZmluZWQgaW4gZGVwZW5kZW5jZSBvZiB5IGFuZCB6LCB3aGljaCBpcyBleGFjdGx5IG91ciBvdXRwdXQuCgoKTGV0IHVzIGFnYWluIGFwcGx5IHRoZSBib2R5KCkgZnVuY3Rpb24uIFJlY2FsbCB0aGF0IGl0IHJldHVybnMgdGhlIGNvbmNyZXRlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uLCBkZXBlbmRpbmcgb24gYWxsIHZhcmlhYmxlcyB0aGF0IGFyZSBwdXQgaW4gdGhlIGZpcnN0IGFyZ3VtZW50LgpgYGB7cn0KYm9keShoKQpgYGAKV2Ugb2J0YWluIHRoZSBjb25jcmV0ZSBmdW5jdGlvbiBkZWZpbml0aW9uIHdoaWNoIHVzZXMgdGhlIHZhcmlhYmxlcyB5IGFuZCB6LCB3aGljaCBpcyBqdXN0IHRoZSByZXN1bHQgb2YgeV4yICsgMiAqIHkgKiB6IC0gei4KCkxldCB1cyBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gZm9yIHRoZSBjb25jcmV0ZSB2YWx1ZXMgeSA9IDEsIHogPSA1LgpgYGB7cn0KaCgxLDUpCmBgYApTbyBoKDEsNSkgPSA2LgoKSWYgeW914oCZcmUgdXNpbmcgYSBmdW5jdGlvbiB0aGF0IHlvdSB3cm90ZSBidXQgd2hpY2ggeW914oCZdmUgZm9yZ290dGVuIHRoZSBkZXRhaWxzIG9mLiBQcmludGluZyBvdXQgYSBmdW5jdGlvbiBpcyBhbHNvIHVzZWZ1bCBpZiB5b3UgYXJlIG5vdCBxdWl0ZSBzdXJlIHdoYXQgYW4gUiBsaWJyYXJ5IGZ1bmN0aW9uIGRvZXMuIEJ5IGxvb2tpbmcgYXQgdGhlIGNvZGUsIHlvdSBtYXkgdW5kZXJzdGFuZCBpdCBiZXR0ZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIG5vdCBzdXJlIGFzIHRvIHRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGUgZ3JhcGhpY3MgZnVuY3Rpb24gYWJsaW5lKCksIHlvdSBjb3VsZCBicm93c2UgdGhyb3VnaCBpdHMgY29kZSB0byBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgdG8gdXNlIGl0LgoKCgoK