R:嵌套For循环以产生级联字符串

时间:2019-05-21 17:17:14

标签: r for-loop

我正在尝试获取一个for循环以打印一系列串联的字符串。每个输出应包含一个组ID和一个子组ID。我希望输出只返回每个组的子组数,而不是所有组的所有可能子组。

## list the solution groups, must keep for name of output
chalSolutions <- c("c_2k", "c_6k", "c_9k", "c_13k")

## create cluster limit for each solution group
sol_limits <- c(2,6,9,13)

## nested loop which ideally steps through each solution group, returning 
## a string for only those clusters whose ID is less than or equal to the 
## limit for each group

for(sol in chalSolutions){
   for(lim in sol_limits){
     chalClusters <- c(1:lim)
     for(i in chalClusters){
      obsv <- paste0("results_list$",sol,"_",i,"_obsv")
      print(obsv)
  }
 }
}

当前输出如下:

[1] "results_list$c_2k_1_obsv"
[1] "results_list$c_2k_2_obsv"
[1] "results_list$c_2k_1_obsv"
...
[1] "results_list$c_2k_6_obsv"
[1] "results_list$c_2k_1_obsv"
...
[1] "results_list$c_2k_9_obsv"
[1] "results_list$c_2k_1_obsv"
...
[1] "results_list$c_2k_13_obsv"
[1] "results_list$c_6k_1_obsv"
[1] "results_list$c_6k_2_obsv"
[1] "results_list$c_6k_1_obsv"
...
[1] "results_list$c_6k_6_obsv"
[1] "results_list$c_6k_1_obsv"
...
[1] "results_list$c_6k_9_obsv"
...

它看起来应该像这样:

[1] "results_list$c_2k_1_obsv"
[1] "results_list$c_2k_2_obsv"
[1] "results_list$c_6k_1_obsv"
...
[1] "results_list$c_6k_6_obsv"
[1] "results_list$c_9k_1_obsv"
...
[1] "results_list$c_9k_9_obsv"
[1] "results_list$c_13k_1_obsv"
...
[1] "results_list$c_13k_13_obsv"

1 个答案:

答案 0 :(得分:1)

在相等长度的输入列表之间考虑mapply(apply系列的元素循环成员)。

obsv <- mapply(function(c, s) paste0("results_list$", c, "_", 1:s, "_obsv"), 
               chalSolutions, sol_limits)   
obsv
# $c_2k
# [1] "results_list$c_2k_1_obsv" "results_list$c_2k_2_obsv"
# 
# $c_6k
# [1] "results_list$c_6k_1_obsv" "results_list$c_6k_2_obsv"
# [3] "results_list$c_6k_3_obsv" "results_list$c_6k_4_obsv"
# [5] "results_list$c_6k_5_obsv" "results_list$c_6k_6_obsv"
# 
# $c_9k
# [1] "results_list$c_9k_1_obsv" "results_list$c_9k_2_obsv"
# [3] "results_list$c_9k_3_obsv" "results_list$c_9k_4_obsv"
# [5] "results_list$c_9k_5_obsv" "results_list$c_9k_6_obsv"
# [7] "results_list$c_9k_7_obsv" "results_list$c_9k_8_obsv"
# [9] "results_list$c_9k_9_obsv"
# 
# $c_13k
#  [1] "results_list$c_13k_1_obsv"  "results_list$c_13k_2_obsv" 
#  [3] "results_list$c_13k_3_obsv"  "results_list$c_13k_4_obsv" 
#  [5] "results_list$c_13k_5_obsv"  "results_list$c_13k_6_obsv" 
#  [7] "results_list$c_13k_7_obsv"  "results_list$c_13k_8_obsv" 
#  [9] "results_list$c_13k_9_obsv"  "results_list$c_13k_10_obsv"
# [11] "results_list$c_13k_11_obsv" "results_list$c_13k_12_obsv"
# [13] "results_list$c_13k_13_obsv"

使用unlist取消嵌套矢量的嵌套:

obsv <- unlist(mapply(function(c, s) paste0("results_list$", c, "_", 1:s, "_obsv"), 
                      chalSolutions, sol_limits, USE.NAMES = FALSE))
obsv
#  [1] "results_list$c_2k_1_obsv"   "results_list$c_2k_2_obsv"  
#  [3] "results_list$c_6k_1_obsv"   "results_list$c_6k_2_obsv"  
#  [5] "results_list$c_6k_3_obsv"   "results_list$c_6k_4_obsv"  
#  [7] "results_list$c_6k_5_obsv"   "results_list$c_6k_6_obsv"  
#  [9] "results_list$c_9k_1_obsv"   "results_list$c_9k_2_obsv"  
# [11] "results_list$c_9k_3_obsv"   "results_list$c_9k_4_obsv"  
# [13] "results_list$c_9k_5_obsv"   "results_list$c_9k_6_obsv"  
# [15] "results_list$c_9k_7_obsv"   "results_list$c_9k_8_obsv"  
# [17] "results_list$c_9k_9_obsv"   "results_list$c_13k_1_obsv" 
# [19] "results_list$c_13k_2_obsv"  "results_list$c_13k_3_obsv" 
# [21] "results_list$c_13k_4_obsv"  "results_list$c_13k_5_obsv" 
# [23] "results_list$c_13k_6_obsv"  "results_list$c_13k_7_obsv" 
# [25] "results_list$c_13k_8_obsv"  "results_list$c_13k_9_obsv" 
# [27] "results_list$c_13k_10_obsv" "results_list$c_13k_11_obsv"
# [29] "results_list$c_13k_12_obsv" "results_list$c_13k_13_obsv"