1

I'm trying to get a for-loop to print a sequence of concatenated strings. Each output should be comprised of a group ID and a subgroup ID. I would like for the output to only return the number of subgroups per group, rather than all of the possible subgroups for all groups.

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

The output currently looks like this:

[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"
...

whereas it should look like this:

[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 Answer 1

1

Consider mapply (elementwise loop member of apply family) between equal length list of your inputs.

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"

Use unlist to unnest the grouped vectors:

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"
Sign up to request clarification or add additional context in comments.

4 Comments

Thanks, this worked quite well! Now the challenge is to figure out how to feed these into a plotting function, where each chalCluster is facetted according to chalSolution...
I almost guessed this was an XY Problem. Consider asking a new one with graphing details.
Yeah, I overcomplicated by going down this route. Back to the drawing board and sticking closer to the loop that created the results_list in the first place. Thanks tho!
I am pretty sure there is a non-nested for loop solution. But we need specifics on graphing needs.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.