From wdunlap at tibco.com  Tue Oct 15 01:30:30 2013
From: wdunlap at tibco.com (William Dunlap)
Date: Mon, 14 Oct 2013 23:30:30 +0000
Subject: [Rd] how to prevent default argument values from being found
Message-ID: <E66794E69CFDE04D9A70842786030B933FA0671D@PA-MBX01.na.tibco.com>

Here is a problem I ran across in RStudio, which uses masks a number of standard R functions with versions that do a bit more than the original does.  The RStudio people have figured out a way to prevent default values of arguments from being found when an argument is missing from a call!

junk1 <- function(...) {
    fun <- function(pkgs, lib = NULL)
    {
        list(missing=missing(lib),
             lib=try(lib, silent = TRUE),
             pkgs = pkgs)
    }
    hook <- function(FUN, pkgs, lib, ...)
    {
        FUN(pkgs, lib, ...)
    }
    hook(fun, ...) 
}

When we run this with one argument, it reports that fun's 'lib' argument is missing
but it dies saying there is no default value.  But there is a default value: NULL.
(If I leave out the try() I get the same problem.)

> junk1("aPackage")
$missing
[1] TRUE

$lib
[1] "Error in try(lib, silent = TRUE) : \n  argument \"lib\" is missing, with no default\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in doTryCatch(return(expr), name, parentenv, handler): argument "lib" is missing, with no default>

$pkgs
[1] "aPackage"

If we change that hook function so it does not assume that the 'pkgs' and 'libs' arguments are
passed in then default argument evaluation works as expected.

junk2 <- function (...)
{
    fun <- function(pkgs, lib = NULL) {
        list(missing = missing(lib), lib = try(lib, silent = TRUE),
            pkgs = pkgs)
    }
    hook <- function(FUN, ...) {
        FUN(...)
    }
    hook(fun, ...)
}
> junk2("aPackage")
$missing
[1] TRUE

$lib
NULL

$pkgs
[1] "aPackage"

It is curious that one can circumvent normal R argument processing.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com



[Rd] how to prevent default argument values from being found
William Dunlap