2014-12-03 56 views
6

我是R编程新手。我不知道我们是否可以将开关语句用于数字对象。开关语句不适用于数值对象

这是我的代码,

myfunction <- function() { 
    x <- 10 
    switch(x, 
     1={ 
      print("one") 
     }, 
     2={ 
      print("two") 
     }, 
     3={ 
      print("three") 
     }, 
     { 
      print("default")  #Edited one.. 
     } 
    ) 
} 

我得到这个错误,

test.R:4:18: unexpected '=' 
3:   switch(x, 
4:     1= 
        ^

请帮我出这个问题。

回答

6
myfunction <- function(x) { 
         switch(x, 
           print("one"), 
           print("two"), 
           print("three"))} 

myfunction(1) 
## [1] "one" 

编辑: 正如评论所说,这种方法不评估正在输入的值,而不是把它们作为一个指标。因此,它适用于你的情况,但如果语句要重新排序,它将不起作用(请参阅@Joshs回答以获得更好的方法)。

无论哪种方式,我不认为switch是在这种情况下使用的正确功能,因为它主要是用于在不同的选择之间切换,而在你的情况下,你基本上反复运行相同的功能。因此,为每个备选方案添加额外的陈述看起来太多了(例如,如果您想要显示20个不同的数字,则必须编写20个不同的陈述)。

相反,你可以试试english包,让您可以显示尽可能多的数字,你将在ifelse声明定义

library(english) 
myfunction2 <- function(x) { 
       ifelse(x %in% 1:3, 
         as.character(as.english(x)), 
         "default")} 
myfunction2(1) 
## [1] "one" 
myfunction2(4) 
## [1] "default" 

或者,你也可以尽量避免使用switch(尽管不一定推荐)通过使用match

myfunction3 <- function(x) { 
    df <- data.frame(A = 1:3, B = c("one", "two", "three"), stringsAsFactors = FALSE) 
     ifelse(x %in% 1:3, 
      df$B[match(x, df$A)], 
      "default")} 
myfunction3(1) 
## [1] "one" 
myfunction3(4) 
## [1] "default" 
+0

如果你不介意告诉我如何添加默认此switch语句? – Venkatesh 2014-12-03 19:14:15

+0

例如(如果您希望1是您的默认值),请不要使用'function(x)'执行'函数(x = 1)'。您也可以删除所有的名称,只需将'switch(x, {print(“one”)}, {print(“two”)}, {print(“three”)} )'(wihtout the名字),如MrFlick所述 – 2014-12-03 19:16:17

+0

我想我对我的问题并不清楚。对不起。我想给我的开关箱默认情况下,我会怎么做? – Venkatesh 2014-12-03 19:20:09

2

我建议阅读?switch帮助页面。这在这里似乎有相当好的描述。 R中的名称不能是数字,即c(1 = 5)不被允许,也不是f(1 = 5,2 = 5)。如果你真的有1,2或3,那么你只想要

switch(x, 
    {print("one")}, 
    {print("two")}, 
    {print("three")} 
) 

(省略数值的名称)

8

要充分利用switch的功能(特别是其处理能力随心所欲值与最终的“默认”表达式)来处理除1,2,3以外的数字,...,你最好将任何输入转换为字符串。

我会做这样的事情:

myfunction <- function(x) { 
    switch(as.character(x), 
     "1" = print("one"), 
     "2" = print("two"), 
     "3" = print("three"), 
     print("something other than 'one', 'two', or 'three'")) 
} 

myfunction(1) 
# [1] "one" 
myfunction(345) 
# [1] "something other than 'one', 'two', or 'three'"