R switch语句具有不同的输出抛出错误

时间:2014-12-15 19:28:42

标签: r switch-statement

我遇到以下开关声明时遇到问题:

names <- rep(1:num.bins, 3)
names <- sort(names)
c.names <- sapply(1:(3*num.bins), function(i){

   switch( i %% 3,
           1 = paste0("M", names[i]),
           2 = paste0("F", names[i]),
           0 = paste0("E", names[i])
            )
    })

如果我的数字&#39;是3,我喜欢以下输出:

print(names)
[1] 1 1 1 2 2 2 3 3 3

print(c.names)
[1] "M1" "F1" "E1" "M2" "F2" "E2" "M3" "F3" "E3"

然而,我收到了错误。非常感谢你的帮助。

3 个答案:

答案 0 :(得分:5)

您收到错误是因为您无法使用01等数字作为参数名称。

但是,如果没有切换声明,可以采用一种简单的方法来执行您尝试执行的操作:

num.bins <- 3
c.names <- paste0(c("M", "F", "E"), rep(1:num.bins, each = 3))
# [1] "M1" "F1" "E1" "M2" "F2" "E2" "M3" "F3" "E3"

答案 1 :(得分:4)

您需要确定您使用的switch版本。如果您决定使用数字版本,那么您需要将索引从1开始。(零索引将不会成功。)数字版本不使用名称策略,但更像是选择&#34; [&#34;或&#34; [[&#34;:

names <- rep(1:3, 3)
names <- sort(names)
c.names <- sapply(1:(3*3), function(i){

   print( switch( (i %% 3) +1,
           paste0("M", names[i]),
           paste0("F", names[i]),
           paste0("E", names[i])
            ))
    })

[1] "F1"
[1] "E1"
[1] "M1"
[1] "F2"
[1] "E2"
[1] "M2"
[1] "F3"
[1] "E3"
[1] "M3"

如果你想要角色版本(因为或者as.character可能是强制你的模数表达式的路径),那么你将使用val=expr语法。

答案 2 :(得分:3)

请阅读?switch帮助页面。如果将数值作为第一个参数传递,则会忽略命名参数(并且无论如何都不能将数字作为命名参数)。如果你真的想要,你可以转换为角色。

c.names <- sapply(1:(3*num.bins), function(i){
   switch( as.character(i %% 3),
           "1" = paste0("M", names[i]),
           "2" = paste0("F", names[i]),
           "0" = paste0("E", names[i])
            )
    })
相关问题