将函数更改为数值

时间:2018-07-19 08:21:27

标签: r function

我有一个在示例fn_example_1中调用的函数,该函数需要使用另一个函数(n)的参数进行更改。

例如,它需要有一个永远不变的固定部分和一个用n变长的可变部分:

# this is the function that needs to change
fn_example_1 <- function(x, mod) {

  # -- this part is fixed
  mod$a <- x^2 # fixed

  # -- this part can change with n 
  mod$b[5,5, k] <- x + 1 # variable
  mod$b[6, 6, k] <- x + 1 #  variable
  # mod$b[7,7, k] <- x + 1 # if n = 3 ecc..

  # k is an arg from a third function, more on that later..
  mod
}

这就是我的构想,基本上是一个包装函数,它返回fn_example_1上的另一版本的n

fn_wrap_example <- function(fn, n) {
  # something
  # something
  # I've thought about a long if else, of course with a max value for n.
  return(fn)
} 

fn_wrap_example(fn_example_1, n = 2) # call to the wrapper

至关重要的是fn_wrap_example返回一个函数,这将是第三个函数的参数。为了简化起见,n可以具有最大值,即:20。

关键是fn_example_1是随n改变的函数。

2 个答案:

答案 0 :(得分:1)

以下是您可以在包装器中修改函数的方法:

fn_factory <- function(n) {
  fn <- function(x, mod) {

    # -- this part is fixed
    mod$a <- x^2 # fixed

    x #place holder

    # k is an arg from a third function, more on that later..
    mod
  }

  ins <- switch(n,
         "1" = quote(mod$b[5,5, k] <- x + 1),
         "2" = quote(mod$b[6, 6, k] <- x + 1)
         )

  body(fn)[[3]] <- ins

  return(fn)
} 

fn_factory(2)
#function (x, mod) 
#{
#  mod$a <- x^2
#  mod$b[6, 6, k] <- x + 1
#  mod
#}
#<environment: 0x0000000008334eb8>

我严重怀疑您是否需要这样做,但是当然可以做到。

答案 1 :(得分:0)

您正在寻找的被称为闭包。

https://www.r-bloggers.com/closures-in-r-a-useful-abstraction/

http://adv-r.had.co.nz/Functional-programming.html

简单的例子:

power <- function(exponent) {
  function(x) {
    x ^ exponent
  }
}

square <- power(2)
square(2)