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



我在使用以下开关语句时遇到问题:

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])
            )
    })

如果我的"num.bins"是 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"

但是,我收到错误。非常感谢您的帮助。

您收到错误,因为您不能使用 01 等数字作为参数的名称。

但是,有一种简单的方法可以在没有 switch 语句的情况下执行您尝试执行的操作:

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"
您需要

决定您正在使用的switch版本。如果您决定使用数字版本,则需要从 1 开始索引。(零索引不会成功。数字版本不使用名称策略,但更像是选择带有"["或"[["的项目:

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 语法。

请阅读?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])
            )
    })

最新更新