Skip to content
Snippets Groups Projects
Select Git revision
  • e9e44df1a5a06cd5f37041b105bac5df8e9acf88
  • main default protected
2 results

distribute_points.m

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    getse.R 3.01 KiB
    # Do this in a separate file to see the generated help:
    #library(devtools)
    #document()
    #load_all(as.package("../../onlineforecast"))
    #?getse
    
    
    #' A helping function for getting subelemlts from a list.
    #'
    #' Often it is needed to get a subelement from a list, which can be done using lapply.
    #' But to make life easiere here is a small function for getting subelements in a nested list at a certain debth.
    #' 
    #' @title Getting subelement from list.
    #' @param L The list to get sub elements from.
    #' @param inm Either an integer index or a name of the subelements to return.
    #' @param depth The depth of the subelements to match names in:
    #'     - 1: is directly in the list.
    #'     - 2: is in list of each element in the list.
    #'     - 3 and more: simply deeper in the sublists.
    #' @param useregex logical: should inm be used as regex pattern for returning elements matching, in the specified layer.
    #' @param fun function: if given, then it will be applied to all the matched subelements before returning them.
    #' @return A list of the matched elements.
    #' 
    #' @examples
    #' # Make a nested list
    #' L <- list(x1=list(x=list("val11","val112"),
    #'                   y=list("val12"),
    #'                   test=list("testlist2")),
    #'           x2=list(x=list("val21","val212"),
    #'                   y=list("val22"),
    #'                   test=list("testlist2")),
    #'           x3=list(x=list("val31","val312"),
    #'                   y=list("val32"),
    #'                   test=list("testlist3")))
    #'
    #' # Get the subelement "x1"
    #' str(getse(L, "x1", depth=1))
    #' # Same as
    #' str(L[["x1"]])
    #'
    #' # Get the element named x in second layer
    #' str(getse(L, "x", depth=2))
    #' # Depth is default to 2
    #' str(getse(L, "y"))
    #'
    #' # Nice when splitting string
    #' x <- strsplit(c("x.k1","y.k2"), "\\.")
    #' # Get all before the split "\\."
    #' getse(x, 1)
    #' # Get after
    #' getse(x, 2)
    #'
    #' # Get an element with an integer index
    #' x <- strsplit(c("x.k1","y.k2","x2"), "\\.")
    #' getse(x, 1)
    #' # if the element is not there, then an error is thrown
    #' try(getse(x, 2))
    #' 
    #' # Use regex pattern for returning elements matching in the specified layer
    #' getse(L, "^te", depth=2, useregex=TRUE)
    #' 
    #' @export
    
    getse <- function(L, inm = NA, depth = 2, useregex = FALSE, fun = NA) {
        if(depth < 0){ stop("depth has to be 1,2,3,...") }
        # Get a list of all sub elements in L matching pattern at the given depth
        # Depth==1 is directly the subelements of L, i.e. L[nms]
    
        # Match directly in L?
        if(depth == 1){
            if(useregex){ inm <- grep(inm, names(L)) }
            R <- L[[inm]]
            if(class(fun) == "function"){ R <- fun(R) }
        }
        # Match in the subelements of L?
        if(depth == 2){
            R <- lapply(L, function(x){
                if(useregex){ inm <- grep(inm, names(x)) }
                val <- x[[inm]]
                if(class(fun) == "function"){ val <- fun(val) }
                return(val)
            })
        }
    
        # Go one level deeper
        if(depth >= 3){
            R <- lapply(L, function(x){
                getse(x, inm, depth-1, useregex, fun)
            })
        }
        return(R)
    }