Using a counter inside an apply structured loop in R

后端 未结 3 1550
Happy的楠姐
Happy的楠姐 2021-01-12 15:27

I\'m trying to plot from a rather complex array in R. I want to produce an image with 3 by 3 graphs, each with red and blue points on it.

I\'ve got a structure of a

相关标签:
3条回答
  • 2021-01-12 15:36

    I am not going to rewrite your code as I must say it is difficult to comprehend, but this will help: you can update a variable outside of the scope of apply by using <<- assignment, e.g. to update some external "counter"

    0 讨论(0)
  • 2021-01-12 15:45

    I think it might be easier to use loops in this case. Also, your code does not have a line to update the counter, like counter <- counter + 1. From inside apply you will need to assign to the global environment using <<-, note the doubled smaller < sign. An example using lapply, e.g.

    Single lapply usage

    counter <- 0
    lapply(1:3, function(x) {
      counter <<- counter + 1
      cat("outer", counter, "\n")
      plot(1:10, main=counter)
    })
    

    Or nested usage of lapply

    counter <- 0
    lapply(1:3, function(x) {
      counter <<- counter + 1
      cat("outer", counter, "\n")
      lapply(1:3, function(x) {
        counter <<- counter + 1
        cat("inner", counter, "\n") 
        plot(1:10, main=counter)     
      })
    })
    
    0 讨论(0)
  • 2021-01-12 15:46

    The key thing here is to use lapply on the index rather than on the array itself, so then you can use the index to subset both your y limits and the array ahead of the inner loop. This also avoids having to use the <<- construct.

    Simplified your data a bit:

    par(mfrow=c(3,3),pty="s")             # a 3 by 3 graphic
    set.seed(1001)
    x <- 1:10                             # with 1 to 54 along the x axis
    dims <- c(10,6,3,2)
    y <- array(rexp(prod(dims)), dim=c(10,6,3,2)) # and the y axis coming 
    ymax <- c(1,0.1,0.3)
    
    lapply(1:3, function(counter, arr) {
      apply(
        arr[ ,counter + 2, , ], 2, 
        function(ii) {
          plot(x, ii[,1], col="blue", ylim=c(0,ymax[counter]))
          points(x, ii[,2], col="red") 
        } )
      },
      arr=y
    )
    

    enter image description here

    0 讨论(0)
提交回复
热议问题