[R] How to pass value to an argument in a function which is an argument to the main function

David Winsemius dwinsemius at comcast.net
Sat May 8 02:51:15 CEST 2010


On May 7, 2010, at 5:05 PM, David Winsemius wrote:

>
> On May 7, 2010, at 4:18 PM, Jun Shen wrote:
>
>> David,
>>
>> my.boxplot.stats is modified from boxplot.stats (package grDevices)  
>> as follows. x is the original argument, I guess it's the data  
>> object for processing. I only added "type". Thanks.
>
> Right, but you should be assigning stats=my.boxplot.stats, not  
> stats=myboxplot.stats(type=6). The functions then pick up their  
> arguments from their environment.
>

Here's a worked example using modifications of a panel.bwplot help  
page call:

(bwplot(voice.part ~ height, data = singer, stats=my.boxplot.stats,
        xlab = "Height (inches)",
        panel = function(...) {
            panel.grid(v = -1, h = 0)
            panel.bwplot(..., coef=3, type=1)
        },
        par.settings = list(plot.symbol = list(pch = 4))))

One of the problems I faced was that I really could not see much  
difference between the results of changing the "type" for quantile.  
You provided no dataset for which you thought the difference made  
a .... difference. So I changed the coef argument to create an effect  
I could see.


> (And learn to send plain text. It is very easy to do so in gmail.)
>
> -- 
> David.
>
>>
>> Jun
>>
>> =============================================================
>> > boxplot.stats
>>
>> function (x, coef = 1.5, do.conf = TRUE, do.out = TRUE)
>> {
>>    if (coef < 0)
>>        stop("'coef' must not be negative")
>>    nna <- !is.na(x)
>>    n <- sum(nna)
>>    stats <- stats::fivenum(x, na.rm = TRUE)
>>    iqr <- diff(stats[c(2, 4)])
>>    if (coef == 0)
>>        do.out <- FALSE
>>    else {
>>        out <- if (!is.na(iqr)) {
>>            x < (stats[2L] - coef * iqr) | x > (stats[4L] + coef *
>>                iqr)
>>        }
>>        else !is.finite(x)
>>        if (any(out[nna], na.rm = TRUE))
>>            stats[c(1, 5)] <- range(x[!out], na.rm = TRUE)
>>    }
>>    conf <- if (do.conf)
>>        stats[3L] + c(-1.58, 1.58) * iqr/sqrt(n)
>>    list(stats = stats, n = n, conf = conf, out = if (do.out) x[out &
>>        nna] else numeric(0L))
>> }
>> <environment: namespace:grDevices>
>>
>>
>> On Fri, May 7, 2010 at 3:09 PM, David Winsemius <dwinsemius at comcast.net 
>> > wrote:
>>
>> On May 7, 2010, at 3:30 PM, Jun Shen wrote:
>>
>> Dear all,
>>
>> I constructed this function called my.boxplot.stats by replacing  
>> fivnum()
>> with quantile() in function boxplot.stats(). So I can try different  
>> quantile
>> methods in bwplot(). The problem is I couldn't pass different  
>> values to the
>> "type" argument to my.boxplot.stats, which in turn is an argument in
>> bwplot(). Now I just have to manually change the "type" value in
>> my.boxplot.stats. What I would like to do is call bwplot() like
>>
>> bwplot(CL~DOSE,data=patab,stats=my.boxplot.stats(type=7)),
>>
>>
>> You have defined a function with an argument of x that does not  
>> have a default value, so it throws an error when you call it with  
>> no value for x. (It's not complaining about the type argument.)
>>
>> -- 
>> David.
>>
>>
>> But I got an error:
>> Error in my.boxplot.stats(type = 7) : element 1 is empty;
>> the part of the args list of 'is.na' being evaluated was:
>> (x)
>>
>> Thanks a lot.
>>
>> Jun Shen from Millipore Corporation
>>
>> ========================================================
>> my.boxplot.stats<-function (x, coef = 1.5, *type=6*, do.conf =  
>> TRUE, do.out
>> = TRUE)
>> {
>>  if (coef < 0)
>>      stop("'coef' must not be negative")
>>  nna <- !is.na(x)
>>  n <- sum(nna)
>>  stats <- stats::quantile(x, type=type,na.rm = TRUE)
>>  iqr <- diff(stats[c(2, 4)])
>>  if (coef == 0)
>>      do.out <- FALSE
>>  else {
>>      out <- if (!is.na(iqr)) {
>>          x < (stats[2L] - coef * iqr) | x > (stats[4L] + coef *
>>              iqr)
>>      }
>>      else !is.finite(x)
>>      if (any(out[nna], na.rm = TRUE))
>>          stats[c(1, 5)] <- range(x[!out], na.rm = TRUE)
>>  }
>>  conf <- if (do.conf)
>>      stats[3L] + c(-1.58, 1.58) * iqr/sqrt(n)
>>  list(stats = stats, n = n, conf = conf, out = if (do.out) x[out &
>>      nna] else numeric(0L))
>> }
>>
>>       [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>> David Winsemius, MD
>> West Hartford, CT
>>
>>
>
> David Winsemius, MD
> West Hartford, CT
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list