如何将函数作为R中另一个函数的参数传递?

时间:2012-11-21 07:46:17

标签: r

考虑以下示例:

q1.func <- function(x) {
  num <- (cos(30.2 * x^(1/2)))^2 
  denom <- (x^0.7) * exp(0.9*x)

  num / denom
}

method1 <- function(n) {
  x <- runif(n,min = 0, max = 1.7)
  f <- q1.func(x)  

  (1.7) * sum((1/n) * f)
} 

draw.graph <- function() {
  n <- seq(1,1000,1)
  x <- c()
  for(i in 1:length(n)) {
    x <- append(x, method1(n[i]))
  }
  plot(n, x, type = "p", xlab = "N",ylab = "value" ,main = "method1 plot",col = "black")
}

我的观点是我希望能够执行: draw.graph(method1(n)) 。但R不允许我这样做。我不明白为什么会这样?我的最终目标是我能够传递method2 / method3 / ....作为draw.graph()函数的参数。但是如何???现在,我只对允许我将method1作为draw.graph函数的参数传递的解决方案感兴趣。请不要让我在draw.graph函数中编写method1,因为我已经知道它有效。但我更感兴趣的是将method1作为draw.graph函数的参数传递。感谢

2 个答案:

答案 0 :(得分:5)

我将举一个更简单的例子来说明要点(你提出的代码存在其他问题)。

fun1 = function(x) cos(x)
fun2 = function(x) sin(x)

# function where one argument is a function
wrapper = function(a = 2, fun = fun1){

  x = 1:10
  return(data.frame(x = x, y = a*fun(x)))
}

# testing behaviour
wrapper()
wrapper(fun = fun2)

答案 1 :(得分:5)

您的draw.graph函数缺少参数。 为什么不简单地使用函数的返回值作为下一个函数的参数?

draw.graph <- function(y) {
  plot(seq_along(y), y)
}

method1 <- function(n) {
  return(runif(n, min=0, max=1.7))
}

draw.graph(method1(100))

如果你真的需要一个函数作为参数,你可以尝试以下(请阅读?match.fun):

## stupid example
calc <- function(x, fun) {
  fun <- match.fun(fun)
  return(fun(x))
}

calc(1:10, sum)

编辑: 为了满足OP问题/评论,我添加了这个具体的例子:

q1.func <- function(x) {
  num <- cos(30.2 * sqrt(x))^2
  denom <- x^0.7 * exp(0.9*x)
  return(num/denom)
}

method1 <- function(n) {
  x <- runif(n, min=0, max=1.7)
  return(1.7*sum(1/n*q1.func(x)))
}

draw.graph <- function(n, fun) {
  fun <- match.fun(fun)
  y <- unlist(lapply(n, fun))
  plot(n, y)
}

draw.graph(1:1000, method1)

enter image description here