我在使用以下开关语句时遇到问题:
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"
但是,我收到错误。非常感谢您的帮助。
您收到错误,因为您不能使用 0
或 1
等数字作为参数的名称。
但是,有一种简单的方法可以在没有 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])
)
})