[R] How does this function print, why is n1 which equals 1 printed as 2?

David Winsemius dwinsemius at comcast.net
Fri Feb 1 15:30:24 CET 2013


On Feb 1, 2013, at 7:47 AM, John Sorkin wrote:

> Windows 7, R 2.12.1
> Colleagues,
> I am trying to understand the n.for.2means function. The code below  
> is a copy of the function (renamed to n.for.2means.js). I have  
> inserted a single line of code towards the bottom of the function  
> which uses the cat function to print the value of n1. You will note  
> the value (preceded by stars) is printed as 1.
> The function (1) prints a lot of output without any instructions in  
> the function to print anything (other than the cat statement I  
> added), and when it prints (2) reports the value of n1 to be 2!.
> I have two questions, (i) how is the function printing when there is  
> no code to print and (ii) how is n1 which equals 1 being reported as  
> 2? I suspect there is something fundamental about R that I don't know.

1) on my machine the output from the cat() call is:

******n1*******= 1

2) All of the "output without any instructions in the function to  
print anything"  is just the value of the list object from the  
function. Unless you return values using the `invisible` function, any  
user define function executed at the console will print its value.  
That is standard interactive session behavior. So one gets after the  
the cat output:

$mu1
[1] 0

$mu2
[1] 8

$sd1
[1] 1.666667

$sd2
[1] 1.666667

$alpha
[1] 0.05

$n1
[1] 1

$n2
[1] 1

$power
[1] 0.8

$ratio
[1] 1

$table
   mu1 mu2      sd1      sd2 n1 n2
1   0   8 1.666667 1.666667  1  1

attr(,"class")
[1] "n.for.2means" "list"


-- 
David.

> Thank you for the help.
> John
>
>
> library(epicalc)
> n.for.2means.js <- function (mu1, mu2, sd1, sd2, ratio = 1, alpha =  
> 0.05, power = 0.8)
> {
>  n1 <- (sd1^2 + sd2^2/ratio) * (qnorm(1 - alpha/2) - qnorm(1 -   
> power))^2/(mu1 - mu2)^2
>  n1 <- round(n1)
>  n2 <- ratio * n1
>  if (length(alpha) == 1) {
>    alpha1 <- NULL
>  }
>  else {
>    alpha1 <- alpha
>  }
>  if (length(power) == 1) {
>    power1 <- NULL
>  }
>  else {
>    power1 <- power
>  }
>  if (length(ratio) == 1) {
>    ratio1 <- NULL
>  }
>  else {
>    ratio1 <- ratio
>  }
>  table1 <- cbind(mu1, mu2, sd1, sd2, n1, n2, alpha1, power1,
>                  ratio1)
>  colnames(table1)[colnames(table1) == "alpha1"] <- "alpha"
>  colnames(table1)[colnames(table1) == "power1"] <- "power"
>  colnames(table1)[colnames(table1) == "ratio1"] <- "n2/n1"
>  table1 <- as.data.frame(table1)
>  cat("******n1*******=",n1,"\n")
>  returns <- list(mu1 = mu1, mu2 = mu2, sd1 = sd1, sd2 = sd2,
>                  alpha = alpha, n1 = n1, n2 = n2, power = power,  
> ratio = ratio,
>                  table = table1)
>  class(returns) <- c("n.for.2means", "list")
>  returns
> }
> n.for.2means.js(0,8,10/6,10/6)
>
>
> John David Sorkin M.D., Ph.D.
> Chief, Biostatistics and Informatics
> University of Maryland School of Medicine Division of Gerontology
> Baltimore VA Medical Center
> 10 North Greene Street
> GRECC (BT/18/GR)
> Baltimore, MD 21201-1524
> (Phone) 410-605-7119
> (Fax) 410-605-7913 (Please call phone number above prior to faxing)
> Confidentiality Statement:
> This email message, including any attachments, is for ...{{dropped:15}}



More information about the R-help mailing list