我遇到以下开关声明时遇到问题:
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"
然而,我收到了错误。非常感谢你的帮助。
答案 0 :(得分:5)
您收到错误是因为您无法使用0
或1
等数字作为参数名称。
但是,如果没有切换声明,可以采用一种简单的方法来执行您尝试执行的操作:
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])
)
})