[R] functions as arguments to ther functions with inlinedocs

Duncan Murdoch murdoch.duncan at gmail.com
Thu Jan 24 19:43:36 CET 2013


On 24/01/2013 1:32 PM, Jannis wrote:
> Dear R community,
>
> I have a problem when I use functions as default values for argumnents
> in other functions. When I use curly brackets { here, I can not create a
> package with inlinedocs. It will give me the error when using
> package.skeleton() in my package structure:
>
> Error in parse(text = utxt) : <text>:4:0: unexpected end of input
>
>
> For example:
>
> dummyfunction = function(filters = function(x) {b = 0; x > b} ))
> {
>     # rest of code here
>     return(filters)
> }
>
>
> This seems to me as a legal function declaration but creates the above
> mentioned error. Is this an error of inlinedocs or do I misunderstand
> the R language?

The definition above is not syntactically correct, it has an extra 
closing paren on the first line.  This would be correct:

dummyfunction = function(filters = function(x) {b = 0; x > b} )
{
    # rest of code here
    return(filters)
}

If that still confuses inlinedocs, then it's a bug in that package. This 
might be easier for it to handle:


dummyfunction = function(filters)
{
    if (missing(filters)) filters <- function(x) {b = 0; x > b}
    # rest of code here
    return(filters)
}


and it should be equivalent to the original.

>   Or is there another way of using functions in such a way
> as arguments? In this case I could easily define this filters argument
> inside the function for cases when it is not supplied as an argument but
> I have some more complex functions where I really need to define
> something sequential as an argument like:
>
> dummyfunction = function(filters = {a = 1; b > a; b}) {print('test')}

That's a pretty strange definition.  I would have written it as

dummyfunction = function(filters = b) {
{   a = 1
     b > a
     b
     print('test')
}

Remember that defaults for function arguments are evaluated in the evaluation frame of the function, not
in the caller's evaluation frame, so they don't need to exist when you enter the function, only when you first use the associated argument.

Duncan Murdoch



More information about the R-help mailing list