[R] Multiple outputs of a function

Mark Myatt mark at myatt.demon.co.uk
Fri Oct 20 17:12:05 CEST 2000


isabelle Zabalza-Mezghani <isabelle.zabalza-mezghani at ifp.fr> writes:

>    Hello everybody, 
>
>    I'm writting some functions for experimental designs. The one I'm 
>    working on is similar to "fac.design" on Splus. 
>    The problem I have is with the form of the output : 
>
>    When the argument fraction is submitted, Splus gives something like 
>    : 
>
>         A  B  C 
>     1   -  -  - 
>     2   +  +  - 
>     3   +  -  + 
>     4   -  +  + 
>
>    Fraction :  ~A:B:C 
>
>    The first part of this output is the design, and the second part is 
>    the formula which allows to fractionate the full design. This 
>    output isn't a list. 
>    My problem is the following : 
>    I can't manage to obtain such a composite output. The lonely way 
>    I've already found is to use : 
>    print(design) 
>    cat("Fraction:  ") 
>    print(attr(design,"fraction")). 
>
>    This solution is only suitable for an output on screen, but it 
>    reveals bad as soon as I assign this function 
>    to an object (for ex: tmp <- fac.design( ....) ) since only the 
>    last command I performed (here print(attr(design,"fraction"))) 
>    is assigned to my object tmp. 
>
>    I hope someone can help me ... 

Return a list. For example, here is a simple function to calculate and
return a risk ratio and 95% confidence from a 2-by-2 table

        rr22 <- function(exposure, outcome) 
        {
        tab <- table(exposure, outcome)
        a <- tab[1,1]; b <- tab[1,2]; c <- tab[2,1]; d <- tab[2,2]
        rr <- (a / (a + b)) / (c / (c + d))
        se.log.rr <- sqrt((b/a) / (a+b) + (d / c) / (c + d))
        lci.rr <- exp(log(rr) - 1.96 * se.log.rr)
        uci.rr <- exp(log(rr) + 1.96 * se.log.rr)
        list(estimate = rr, conf.int = c(lci.rr, uci.rr))
        }

In use:

        > rr22(PASTA, ILL)
        $estimate
        [1] 1.682692

        $conf.int
        [1] 1.255392 2.255433

        > b <- rr22(PASTA, ILL)
        > b$estimate
        [1] 1.682692
        > b$conf.int
        [1] 1.255392 2.255433
        > b$conf.int[1]
        [1] 1.255392
        > b$conf.int[2]
        [1] 2.255433

If you need the formatted output then you need to declare a class for
the output list and create a print method for that class:

        rr22 <- function(exposure, outcome) 
        {
        tab <- table(exposure, outcome)
        a <- tab[1,1]; b <- tab[1,2]; c <- tab[2,1]; d <- tab[2,2]
        rr <- (a / (a + b)) / (c / (c + d))
        se.log.rr <- sqrt((b / a) / (a + b) + (d / c) / (c + d))
        lci.rr <- exp(log(rr) - 1.96 * se.log.rr)
        uci.rr <- exp(log(rr) + 1.96 * se.log.rr)
        rr22.output <- list(estimate = rr, conf.int = c(lci.rr, uci.rr))
        class(rr22.output) <- "rr22"
        rr22.output
        }

        print.rr22 <- function(x)
        {
        cat("RR     : ", x$estimate, "\n", 
            "95% CI : ", x$conf.int[1], "-", x$conf.int[2], "\n",
            sep = "")
        }

In use:

        > b <- rr22(PASTA,ILL)
        > b
        RR     : 1.682692
        95% CI : 1.255392-2.255433
        > b$estimate
        [1] 1.682692
        > b$conf.int
        [1] 1.255392 2.255433

I hope that helps.

Mark


--
Mark Myatt


-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list