Create a list of functions from a vector of characters

后端 未结 3 1450
醉酒成梦
醉酒成梦 2021-01-12 08:12

Thanks in advance, and sorry if this question has been answered previously - I have looked pretty extensively. I have a dataset containing a row of with concatenated informa

相关标签:
3条回答
  • 2021-01-12 08:47

    Maybe initialize your list with a single generic function, and then update them using:

    foo <- function(x){x+3}
    > body(foo) <- quote(x+4)
    > foo
    function (x) 
    x + 4
    

    More specifically, starting from a character, you'd probably do something like:

    body(foo) <- parse(text = "x+5")
    
    0 讨论(0)
  • 2021-01-12 09:00

    Just to add onto joran's answer, this is what finally worked:

    test.data <- matrix(data=rep(1,25),5,5)
    test.data <- data.frame(test.data)
    
    test.func <- c("x","x+1","x+2","x+3","x+4")
    func.list <- list()
    
    for(i in 1:length(test.func)){
      func.list[[i]] <- function(x){}
      body(func.list[[i]]) <- parse(text=test.func[i])
    }
    
    processed <- mapply(do.call,func.list,lapply(test.data,list))
    

    Thanks again, joran.

    0 讨论(0)
  • 2021-01-12 09:06

    This is what I do:

    f <- list(identity="x",plus1 = "x+1", square= "x^2")
    funCreator <- function(snippet){
      txt <- snippet
      function(x){
        exprs <- parse(text = txt)
        eval(exprs)   
      }
    }
    listOfFunctions <- lapply(setNames(f,names(f)),function(x){funCreator(x)}) # I like to have some control of the names of the functions
    listOfFunctions[[1]] # try to see what the actual function looks like?
    library(pryr)
    unenclose(listOfFunctions[[3]]) # good way to see the actual function http://adv-r.had.co.nz/Functional-programming.html
    # Call your funcions
    listOfFunctions[[2]](3) # 3+1 = 4
    do.call(listOfFunctions[[3]],list(3)) # 3^2 = 9
    attach(listOfFunctions) # you can also attach your list of functions and call them by name
    square(3)  # 3^2 = 9
    identity(7) # 7 ## masked object identity, better detach it now!
    detach(listOfFunctions)
    
    0 讨论(0)
提交回复
热议问题