Skip to content

Switch and integer

4 messages · Knut Krueger, David Barron, Dieter Menne

#
I searched the help list and the manual, but I do not find my mistake.
Switch is working with character , with integer, but not in the third 
example

Regards Knut


count1 <- 0
test 
=c("3","9","3","9","3","9","8","9","8","9","8","9","3","9","3","9","5","9","3","9","1","2","7","9","3","9","1","1","2","2","3","9","2","1","2","5","9","8","9","1","2")
count1 <- "0"
for (i in 1:length(test))
  switch (EXPR=test[i],
      "5" =     print(test[i]),
      "6" =     print(test[i]),
      "7" =     print(test[i]),
      "8" =     print(test[i]),
      "9" =     print(test[i])
      )
  count1
#         example from helpfile
for(i in c(-1:3,9))  print(switch(i, 1,2,3,4))

# -------- not working
test 
=c(3,9,3,9,3,9,8,9,8,9,8,9,3,9,3,9,5,9,3,9,1,2,7,9,3,9,1,1,2,2,3,9,2,1,2,5,9,8,9,1,2)
count1 <- 0
for (i in 1:length(test))
  switch (EXPR=test[i],
      4 =     count1 <- count1 +1,
      5 =     count1 <- count1 +1,
      6 =     count1 <- count1 +1,
      7 =     count1 <- count1 +1,
      8 =     count1 <- count1 +1
      )
  count1
#
If the value of EXPR is an integer between 1 and nargs()-1 then the
corresponding element of ... is evaluated and the result returned.

So, for integers you don't give names to the elements in ...  This should work:

test=c(3,9,3,9,3,9,8,9,8,9,8,9,3,9,3,9,5,9,3,9,1,2,7,9,3,9,1,1,2,2,3,9,2,1,2,5,9,8,9,1,2)
count1 <- 0
for (i in 1:length(test))
 switch(EXPR=test[i],
     NULL,
     NULL,
     NULL,
     count1 <- count1 +1,
     count1 <- count1 +1,
     count1 <- count1 +1,
     count1 <- count1 +1,
     count1 <- count1 +1,
     NULL
     )
 count1
On 11/12/06, Knut Krueger <Knut-krueger at einthal.de> wrote:

  
    
#
Knut Krueger <Knut-krueger <at> einthal.de> writes:
...
test = c(3,9,3,9,3,9,8,9,8,9,8,9,3,9,3,9,5,9,3,9,1,2,7,9,3,9,1,1,
2,2,3,9,2,1,2,5, 9,8,9,1,2)
switch has a different behavior when an integer is use, which is a bit hidden 
in the term "corresponding". 

"If the value of EXPR is an integer between 1 and nargs()-1 then the
corresponding element of ... is evaluated and the result returned."

So something like the example below might come close to what you want. 
In each case you have to add the default last item to avoid a NULL.

"In the case of no match, if there's a further argument in switch that one 
is returned, otherwise NULL."

Dieter

test =c(4,5,8,1,13)
count1 <- 0
for (i in 1:length(test)) {
  count1 <- switch (EXPR=as.character(test[i]),
      "4" =     count1 +1,
      "5" =     count1 +1,
      "6" =     count1 +1,
      "7" =     count1 +1,
      "8" =     count1 +1,
      count1
      )
}
count1
#
David Barron schrieb:
Thank you, I wondered about the
and the example from the help file for(i in c(-1:3,9))  print(switch(i,
1,2,3,4))
No see I  that the 1,2,3,4 is the output not the value, but it's not
very clear for me ho it works.
I will try to find it out ...
The switch for Integer is very different from C++ or Pascal .. maybe
this was the reason for the problem.

Regards Knut