Skip to content

coping with a warning in if()

4 messages · Héctor Villalobos, jim holtman, Peter Alspach

#
Hi,

I'm sure this one is very easy....

I am trying to write a function where one of its arguments has two posible (strings) values, 
defaulting to one of them if none is specified. My problem is that when evaluating the function 
the following warning is produced:

"the condition has length > 1 and only the first element will be used"

I've read the help page of if() but I don't get it because when evaluating step by step the 
warning is not produced.


Omitting the details of my function, below is an example of this 

## Function
fun <- function( n, result = c("simple", "complete") )
{
  if ( is.null(result) ) 
     result <-  "simple" 
  if ( !(result %in% c("simple", "s", "complete", "c")) ) {
      stop("specify type of result 'simple' or 'complete'")
 } else {
  res <- rnorm(n)
  res
 }
}

## This gives the warning
fun(n=20)

## But this not
fun(n=20, result="other")

## The warning is not produced when doing this step by step
  n <- 20
  result <-  "simple" 
  if ( !(result %in% c("simple", "s", "complete", "c")) ){
      stop("specify type of result 'simple' or 'complete'")
 } else {
  res <- rnorm(n)
  res
 }

## or here
  n <- 20
  result <-  "other" 
  if ( !(result %in% c("simple", "s", "complete", "c")) ){
      stop("specify type of result 'simple' or 'complete'")
 } else {
  res <- rnorm(n)
  res
 }


Thanks for your time

H?ctor
#
Look at what happens when you don't pass in 'result':
[1] TRUE TRUE

result is a vector of length two and provides two results and the 'if'
was only expecting one.  You might have to debug your code some more.

You probably want to use 'missing' and not 'is.null'

2010/1/19 H?ctor Villalobos <hvillalo at ipn.mx>:

  
    
#
Tena koe Hector

In addition to Jim's comment, you might like to define your function as:
 
fun <- function(n, result = "simple")

This will set the default to 'simple' but one can still call it as fun(result='complete'). 

HTH ...

Peter Alspach